mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-08 19:00:27 +00:00
Place TLS sections right after .text, not after embedded zip file
This commit is contained in:
parent
de295966b1
commit
76f065ae91
3 changed files with 33 additions and 29 deletions
57
ape/ape.lds
57
ape/ape.lds
|
@ -349,9 +349,30 @@ SECTIONS {
|
||||||
HIDDEN(_etext = .);
|
HIDDEN(_etext = .);
|
||||||
PROVIDE_HIDDEN(etext = .);
|
PROVIDE_HIDDEN(etext = .);
|
||||||
/*END: Read Only Data (only needed for initialization) */
|
/*END: Read Only Data (only needed for initialization) */
|
||||||
/*END: Read Only Data */
|
|
||||||
} :Rom
|
} :Rom
|
||||||
|
|
||||||
|
/* initialization image for thread-local storage, this is copied */
|
||||||
|
/* out to actual TLS areas at runtime, so just make it read-only */
|
||||||
|
.tdata . : {
|
||||||
|
_tdata_start = .;
|
||||||
|
*(SORT_BY_ALIGNMENT(.tdata))
|
||||||
|
*(SORT_BY_ALIGNMENT(.tdata.*))
|
||||||
|
_tdata_end = .;
|
||||||
|
. = ALIGN(PAGESIZE);
|
||||||
|
} :Tls :Rom
|
||||||
|
/*END: Read Only Data */
|
||||||
|
|
||||||
|
/* this only tells the linker about the layout of uninitialized */
|
||||||
|
/* TLS data, and does not advance the linker's location counter */
|
||||||
|
.tbss . : {
|
||||||
|
_tbss_start = .;
|
||||||
|
*(SORT_BY_ALIGNMENT(.tbss))
|
||||||
|
*(SORT_BY_ALIGNMENT(.tbss.*))
|
||||||
|
. = ALIGN(TLS_ALIGNMENT);
|
||||||
|
/* the %fs register is based on this location */
|
||||||
|
_tbss_end = .;
|
||||||
|
} :Tls
|
||||||
|
|
||||||
.data ALIGN(PAGESIZE) : {
|
.data ALIGN(PAGESIZE) : {
|
||||||
/*BEGIN: Read/Write Data */
|
/*BEGIN: Read/Write Data */
|
||||||
KEEP(*(SORT_BY_NAME(.piro.data.sort.iat.*)))
|
KEEP(*(SORT_BY_NAME(.piro.data.sort.iat.*)))
|
||||||
|
@ -385,26 +406,7 @@ SECTIONS {
|
||||||
. = ALIGN(PAGESIZE);
|
. = ALIGN(PAGESIZE);
|
||||||
} :Ram
|
} :Ram
|
||||||
|
|
||||||
.tdata . : {
|
|
||||||
_tdata_start = .;
|
|
||||||
*(SORT_BY_ALIGNMENT(.tdata))
|
|
||||||
*(SORT_BY_ALIGNMENT(.tdata.*))
|
|
||||||
_tdata_end = .;
|
|
||||||
. = ALIGN(PAGESIZE);
|
|
||||||
} :Tls :Ram
|
|
||||||
|
|
||||||
/*END: file content that's loaded by o/s */
|
/*END: file content that's loaded by o/s */
|
||||||
/*BEGIN: bss memory void */
|
|
||||||
|
|
||||||
.tbss . : {
|
|
||||||
_tbss_start = .;
|
|
||||||
*(SORT_BY_ALIGNMENT(.tbss))
|
|
||||||
*(SORT_BY_ALIGNMENT(.tbss.*))
|
|
||||||
. = ALIGN(TLS_ALIGNMENT);
|
|
||||||
/* the %fs register is based on this location */
|
|
||||||
_tbss_end = .;
|
|
||||||
} :Tls
|
|
||||||
|
|
||||||
/*END: file content */
|
/*END: file content */
|
||||||
/*BEGIN: bss memory that's addressable */
|
/*BEGIN: bss memory that's addressable */
|
||||||
|
|
||||||
|
@ -509,7 +511,7 @@ HIDDEN(ape_rom_rva = RVA(ape_rom_vaddr));
|
||||||
HIDDEN(ape_ram_offset = ape_rom_offset + ape_rom_filesz);
|
HIDDEN(ape_ram_offset = ape_rom_offset + ape_rom_filesz);
|
||||||
HIDDEN(ape_ram_vaddr = ADDR(.data));
|
HIDDEN(ape_ram_vaddr = ADDR(.data));
|
||||||
HIDDEN(ape_ram_paddr = LOADADDR(.data));
|
HIDDEN(ape_ram_paddr = LOADADDR(.data));
|
||||||
HIDDEN(ape_ram_filesz = SIZEOF(.data) + SIZEOF(.tdata));
|
HIDDEN(ape_ram_filesz = SIZEOF(.data));
|
||||||
HIDDEN(ape_ram_memsz = ADDR(.bss) + SIZEOF(.bss) - ape_ram_vaddr);
|
HIDDEN(ape_ram_memsz = ADDR(.bss) + SIZEOF(.bss) - ape_ram_vaddr);
|
||||||
HIDDEN(ape_ram_align = PAGESIZE);
|
HIDDEN(ape_ram_align = PAGESIZE);
|
||||||
HIDDEN(ape_ram_rva = RVA(ape_ram_vaddr));
|
HIDDEN(ape_ram_rva = RVA(ape_ram_vaddr));
|
||||||
|
@ -533,16 +535,16 @@ HIDDEN(ape_note_align = __SIZEOF_POINTER__);
|
||||||
HIDDEN(ape_text_offset = ape_rom_offset + LOADADDR(.text) - ape_rom_paddr);
|
HIDDEN(ape_text_offset = ape_rom_offset + LOADADDR(.text) - ape_rom_paddr);
|
||||||
HIDDEN(ape_text_paddr = LOADADDR(.text));
|
HIDDEN(ape_text_paddr = LOADADDR(.text));
|
||||||
HIDDEN(ape_text_vaddr = ADDR(.text));
|
HIDDEN(ape_text_vaddr = ADDR(.text));
|
||||||
HIDDEN(ape_text_filesz = SIZEOF(.text));
|
HIDDEN(ape_text_filesz = SIZEOF(.text) + SIZEOF(.tdata));
|
||||||
HIDDEN(ape_text_memsz = SIZEOF(.text));
|
HIDDEN(ape_text_memsz = SIZEOF(.text) + SIZEOF(.tdata));
|
||||||
HIDDEN(ape_text_align = PAGESIZE);
|
HIDDEN(ape_text_align = PAGESIZE);
|
||||||
HIDDEN(ape_text_rva = RVA(ape_text_vaddr));
|
HIDDEN(ape_text_rva = RVA(ape_text_vaddr));
|
||||||
|
|
||||||
HIDDEN(ape_data_offset = ape_ram_offset + LOADADDR(.data) - ape_ram_paddr);
|
HIDDEN(ape_data_offset = ape_ram_offset + LOADADDR(.data) - ape_ram_paddr);
|
||||||
HIDDEN(ape_data_paddr = LOADADDR(.data));
|
HIDDEN(ape_data_paddr = LOADADDR(.data));
|
||||||
HIDDEN(ape_data_vaddr = ADDR(.data));
|
HIDDEN(ape_data_vaddr = ADDR(.data));
|
||||||
HIDDEN(ape_data_filesz = SIZEOF(.data) + SIZEOF(.tdata));
|
HIDDEN(ape_data_filesz = SIZEOF(.data));
|
||||||
HIDDEN(ape_data_memsz = SIZEOF(.data) + SIZEOF(.tdata));
|
HIDDEN(ape_data_memsz = SIZEOF(.data));
|
||||||
HIDDEN(ape_data_align = PAGESIZE);
|
HIDDEN(ape_data_align = PAGESIZE);
|
||||||
HIDDEN(ape_data_rva = RVA(ape_data_vaddr));
|
HIDDEN(ape_data_rva = RVA(ape_data_vaddr));
|
||||||
|
|
||||||
|
@ -564,11 +566,10 @@ SHSTUB2(ape_loader_dd_count,
|
||||||
|
|
||||||
#if SupportsMetal()
|
#if SupportsMetal()
|
||||||
HIDDEN(v_ape_realsectors =
|
HIDDEN(v_ape_realsectors =
|
||||||
MIN(0x70000 - IMAGE_BASE_REAL,
|
MIN(0x70000 - IMAGE_BASE_REAL, ROUNDUP(RVA(_ezip), 512)) / 512);
|
||||||
ROUNDUP(RVA(_tdata_end), 512)) / 512);
|
|
||||||
HIDDEN(v_ape_realbytes = v_ape_realsectors * 512);
|
HIDDEN(v_ape_realbytes = v_ape_realsectors * 512);
|
||||||
HIDDEN(v_ape_realdwords = v_ape_realsectors * (512 / 4));
|
HIDDEN(v_ape_realdwords = v_ape_realsectors * (512 / 4));
|
||||||
HIDDEN(v_ape_allsectors = ROUNDUP(RVA(_tdata_end), 512) / 512);
|
HIDDEN(v_ape_allsectors = ROUNDUP(RVA(_ezip), 512) / 512);
|
||||||
HIDDEN(v_ape_allbytes = v_ape_allsectors * 512);
|
HIDDEN(v_ape_allbytes = v_ape_allsectors * 512);
|
||||||
HIDDEN(v_ape_highsectors = v_ape_allsectors - v_ape_realsectors);
|
HIDDEN(v_ape_highsectors = v_ape_allsectors - v_ape_realsectors);
|
||||||
TSSDESCSTUB2(_tss, _tss, _tss_end ? _tss_end - _tss - 1 : 0);
|
TSSDESCSTUB2(_tss, _tss, _tss_end ? _tss_end - _tss - 1 : 0);
|
||||||
|
|
|
@ -61,7 +61,7 @@ textstartup noasan void InitializeMetalFile(void) {
|
||||||
* The zipos code will automatically arrange to do this. Alternatively,
|
* The zipos code will automatically arrange to do this. Alternatively,
|
||||||
* user code can STATIC_YOINK this symbol.
|
* user code can STATIC_YOINK this symbol.
|
||||||
*/
|
*/
|
||||||
size_t size = ROUNDUP(_tdata_end - _base, 4096);
|
size_t size = ROUNDUP(_ezip - _base, 4096);
|
||||||
void *copied_base;
|
void *copied_base;
|
||||||
struct DirectMap dm;
|
struct DirectMap dm;
|
||||||
dm = sys_mmap_metal(NULL, size, PROT_READ | PROT_WRITE,
|
dm = sys_mmap_metal(NULL, size, PROT_READ | PROT_WRITE,
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
_base = 0
|
_base = 0
|
||||||
ape_xlm = 0
|
ape_xlm = 0
|
||||||
_ehead = 0
|
_ehead = 0
|
||||||
|
_ezip = 0
|
||||||
_ereal = 0
|
_ereal = 0
|
||||||
__privileged_start = 0
|
__privileged_start = 0
|
||||||
__privileged_end = 0
|
__privileged_end = 0
|
||||||
|
@ -68,6 +69,7 @@
|
||||||
.globl _edata
|
.globl _edata
|
||||||
.globl _ehead
|
.globl _ehead
|
||||||
.globl _end
|
.globl _end
|
||||||
|
.globl _ezip
|
||||||
.globl _ereal
|
.globl _ereal
|
||||||
.globl _etext
|
.globl _etext
|
||||||
.globl _tdata_start
|
.globl _tdata_start
|
||||||
|
@ -97,6 +99,7 @@
|
||||||
.weak _edata
|
.weak _edata
|
||||||
.weak _ehead
|
.weak _ehead
|
||||||
.weak _end
|
.weak _end
|
||||||
|
.weak _ezip
|
||||||
.weak _ereal
|
.weak _ereal
|
||||||
.weak _etext
|
.weak _etext
|
||||||
.weak _tdata_start
|
.weak _tdata_start
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue