mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-10 11:09:25 +08:00
One reason that ASLR is tricky is the fact that the cygheap is placed at the end of the DLL and especially that it's expected to be growable. To support ASLR, this construct must go. Define dedicated cygheap memory region and reserve entire region. Commit 3 Megs, as was the default size of the cygheap before. Fix linker script accordingly, drop a now useless version check in get_cygwin_startup_info().
178 lines
5.3 KiB
Python
178 lines
5.3 KiB
Python
#ifdef __x86_64__
|
|
OUTPUT_FORMAT(pei-x86-64)
|
|
SEARCH_DIR("/usr/x86_64-pc-cygwin/lib/w32api"); SEARCH_DIR("=/usr/lib/w32api");
|
|
#else
|
|
#error unimplemented for this target
|
|
#endif
|
|
#define __CONCAT1(a,b) a##b
|
|
#define __CONCAT(a,b) __CONCAT1(a,b)
|
|
#define _SYM(x) __CONCAT(__USER_LABEL_PREFIX__, x)
|
|
SECTIONS
|
|
{
|
|
.text __image_base__ + __section_alignment__ :
|
|
{
|
|
*(.init)
|
|
*(.text)
|
|
*(.text.*)
|
|
*(SORT(.text$*))
|
|
*(.glue_7t)
|
|
*(.glue_7)
|
|
#ifdef __x86_64__
|
|
. = ALIGN(8);
|
|
___CTOR_LIST__ = .; __CTOR_LIST__ = .;
|
|
LONG (-1); LONG (-1); *(SORT(.ctors.*)); *(.ctors); *(.ctor); LONG (0); LONG (0);
|
|
___DTOR_LIST__ = .; __DTOR_LIST__ = .;
|
|
LONG (-1); LONG (-1); *(SORT(.dtors.*)); *(.dtors); *(.dtor); LONG (0); LONG (0);
|
|
#else
|
|
___CTOR_LIST__ = .; __CTOR_LIST__ = .;
|
|
LONG (-1); *(SORT(.ctors.*)); *(.ctors); *(.ctor); LONG (0);
|
|
___DTOR_LIST__ = .; __DTOR_LIST__ = .;
|
|
LONG (-1); *(SORT(.dtors.*)); *(.dtors); *(.dtor); LONG (0);
|
|
#endif
|
|
*(.fini)
|
|
/* ??? Why is .gcc_exc here? */
|
|
*(.gcc_exc)
|
|
etext = .;
|
|
*(.gcc_except_table)
|
|
}
|
|
.autoload_text ALIGN(__section_alignment__) :
|
|
{
|
|
*(.*_autoload_text);
|
|
}
|
|
/* The Cygwin DLL uses a section to avoid copying certain data
|
|
on fork. This used to be named ".data$nocopy". The linker used
|
|
to include this between __data_start__ and __data_end__, but that
|
|
breaks building the cygwin dll. Instead, we name the section
|
|
".data_cygwin_nocopy" and explicitly include it after __data_end__. */
|
|
.data ALIGN(__section_alignment__) :
|
|
{
|
|
__data_start__ = .;
|
|
*(.data)
|
|
*(.data2)
|
|
*(SORT(.data$*))
|
|
__data_end__ = .;
|
|
*(.data_cygwin_nocopy)
|
|
}
|
|
.rdata ALIGN(__section_alignment__) :
|
|
{
|
|
*(.rdata)
|
|
*(SORT(.rdata$*))
|
|
*(.rdata_cygwin_nocopy)
|
|
___RUNTIME_PSEUDO_RELOC_LIST__ = .;
|
|
__RUNTIME_PSEUDO_RELOC_LIST__ = .;
|
|
*(.rdata_runtime_pseudo_reloc)
|
|
___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
|
|
__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
|
|
}
|
|
.eh_frame ALIGN(__section_alignment__) :
|
|
{
|
|
*(.eh_frame*)
|
|
}
|
|
.pdata ALIGN(__section_alignment__) :
|
|
{
|
|
*(.pdata*)
|
|
}
|
|
#ifdef __x86_64__
|
|
.xdata ALIGN(__section_alignment__) :
|
|
{
|
|
*(.xdata*)
|
|
}
|
|
#endif
|
|
.bss ALIGN(__section_alignment__) :
|
|
{
|
|
__bss_start__ = .;
|
|
*(.bss)
|
|
*(COMMON)
|
|
__bss_end__ = .;
|
|
}
|
|
.edata ALIGN(__section_alignment__) :
|
|
{
|
|
*(.edata)
|
|
}
|
|
.reloc BLOCK(__section_alignment__) :
|
|
{
|
|
*(.reloc)
|
|
}
|
|
.cygwin_dll_common ALIGN(__section_alignment__):
|
|
{
|
|
*(.cygwin_dll_common)
|
|
}
|
|
.idata ALIGN(__section_alignment__) :
|
|
{
|
|
/* This cannot currently be handled with grouped sections.
|
|
See pe.em:sort_sections. */
|
|
SORT(*)(.idata$2)
|
|
SORT(*)(.idata$3)
|
|
/* These zeroes mark the end of the import list. */
|
|
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
|
|
SORT(*)(.idata$4)
|
|
SORT(*)(.idata$5)
|
|
SORT(*)(.idata$6)
|
|
SORT(*)(.idata$7)
|
|
. = ALIGN(16);
|
|
}
|
|
.rsrc BLOCK(__section_alignment__) :
|
|
{
|
|
*(.rsrc)
|
|
*(SORT(.rsrc$*))
|
|
}
|
|
.gnu_debuglink_overlay ALIGN(__section_alignment__) (NOLOAD):
|
|
{
|
|
BYTE(0) /* c */
|
|
BYTE(0) /* y */
|
|
BYTE(0) /* g */
|
|
BYTE(0) /* w */
|
|
BYTE(0) /* i */
|
|
BYTE(0) /* n */
|
|
BYTE(0) /* 1 */
|
|
BYTE(0) /* . */
|
|
BYTE(0) /* d */
|
|
BYTE(0) /* b */
|
|
BYTE(0) /* g */
|
|
BYTE(0) /* \0 */
|
|
LONG(0) /* checksum */
|
|
}
|
|
/DISCARD/ :
|
|
{
|
|
*(.debug$S)
|
|
*(.debug$T)
|
|
*(.debug$F)
|
|
*(.drectve)
|
|
}
|
|
.stab ALIGN(__section_alignment__) (NOLOAD) :
|
|
{
|
|
*(.stab)
|
|
}
|
|
.stabstr ALIGN(__section_alignment__) (NOLOAD) :
|
|
{
|
|
*(.stabstr)
|
|
}
|
|
/* DWARF 1.1 and DWARF 2 */
|
|
.debug_aranges ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_aranges) }
|
|
.debug_pubnames ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_pubnames) }
|
|
.debug_pubtypes ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_pubtypes) }
|
|
/* DWARF 2 */
|
|
.debug_info ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_info) }
|
|
.debug_abbrev ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_abbrev) }
|
|
.debug_line ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_line) }
|
|
.debug_frame ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_frame) }
|
|
.debug_str ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_str) }
|
|
.debug_loc ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_loc) }
|
|
.debug_macinfo ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_macinfo) }
|
|
/* SGI/MIPS DWARF 2 extensions. */
|
|
.debug_weaknames ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_weaknames) }
|
|
.debug_funcnames ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_funcnames) }
|
|
.debug_typenames ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_typenames) }
|
|
.debug_varnames ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_varnames) }
|
|
.debug_macro ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_macro) }
|
|
/* DWARF 3 */
|
|
.debug_ranges ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_ranges) }
|
|
/* DWARF 4, merged back into .debug_info with DWARF 5 */
|
|
.debug_types ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_types .gnu.linkonce.wt.*) }
|
|
/* DWARF 5 */
|
|
.debug_loclists ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_loclists) }
|
|
.debug_rnglists ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_rnglists) }
|
|
.debug_line_str ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_line_str) }
|
|
|
|
}
|