4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-10 11:09:25 +08:00
newlib-cygwin/winsup/cygwin/cygwin.sc.in
Corinna Vinschen 2f9b8ff00c Cygwin: decouple cygheap from Cygwin DLL
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().
2022-10-28 16:26:53 +02:00

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) }
}