hanchenye-llvm-project/lld/test/elf/X86_64/omagic.test

238 lines
7.6 KiB
Plaintext
Raw Normal View History

# This tests verifies functionality of omagic that we create only two segments,
# PT_LOAD, PT_TLS
# The data segment should not be aligned to a page boundary
RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/nmagic.o \
RUN: --noinhibit-exec -o %t --omagic -static
RUN: llvm-readobj -sections %t | FileCheck -check-prefix=OMAGICSECTIONS %s
RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=OMAGICPROGRAMHEADERS %s
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: (0)
OMAGICSECTIONS: Type: SHT_NULL (0x0)
OMAGICSECTIONS: Flags [ (0x0)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x0
OMAGICSECTIONS: Offset: 0x0
OMAGICSECTIONS: Size: 0
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 0
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .text
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x6)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: SHF_EXECINSTR (0x4)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x4000E8
OMAGICSECTIONS: Offset: 0xE8
OMAGICSECTIONS: Size: 11
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 4
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .eh_frame
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x2)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x4000F8
OMAGICSECTIONS: Offset: 0xF8
OMAGICSECTIONS: Size: 56
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 8
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .eh_frame_hdr
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x2)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x400130
OMAGICSECTIONS: Offset: 0x130
OMAGICSECTIONS: Size: 8
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 8
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .tdata
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x403)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: SHF_TLS (0x400)
OMAGICSECTIONS: SHF_WRITE (0x1)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x400138
OMAGICSECTIONS: Offset: 0x138
OMAGICSECTIONS: Size: 4
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 4
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .tbss
OMAGICSECTIONS: Type: SHT_NOBITS (0x8)
OMAGICSECTIONS: Flags [ (0x403)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: SHF_TLS (0x400)
OMAGICSECTIONS: SHF_WRITE (0x1)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x40013C
OMAGICSECTIONS: Offset: 0x13C
OMAGICSECTIONS: Size: 8
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 4
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .got.plt
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x3)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: SHF_WRITE (0x1)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x400140
OMAGICSECTIONS: Offset: 0x140
OMAGICSECTIONS: Size: 0
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 8
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .data
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x3)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: SHF_WRITE (0x1)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x400140
OMAGICSECTIONS: Offset: 0x140
OMAGICSECTIONS: Size: 4
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 4
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .bss
OMAGICSECTIONS: Type: SHT_NOBITS (0x8)
OMAGICSECTIONS: Flags [ (0x3)
OMAGICSECTIONS: SHF_ALLOC (0x2)
OMAGICSECTIONS: SHF_WRITE (0x1)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x400144
OMAGICSECTIONS: Offset: 0x144
OMAGICSECTIONS: Size: 0
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 4
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .comment
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x0)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x0
OMAGICSECTIONS: Offset: 0x144
OMAGICSECTIONS: Size: 43
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 1
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .note.GNU-stack
OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
OMAGICSECTIONS: Flags [ (0x0)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x0
OMAGICSECTIONS: Offset: 0x16F
OMAGICSECTIONS: Size: 0
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 1
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .shstrtab
OMAGICSECTIONS: Type: SHT_STRTAB (0x3)
OMAGICSECTIONS: Flags [ (0x0)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x0
OMAGICSECTIONS: Offset: 0x16F
OMAGICSECTIONS: Size: 115
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 1
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .symtab
OMAGICSECTIONS: Type: SHT_SYMTAB (0x2)
OMAGICSECTIONS: Flags [ (0x0)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x0
OMAGICSECTIONS: Offset: 0x1E8
[lld] [ELF] Support for general dynamic TLS relocations on X86_64 Summary: This patch adds support for the general dynamic TLS access model for X86_64 (see www.akkadia.org/drepper/tls.pdf). To properly support TLS, the patch also changes the __tls_get_addr atom to be a shared library atom instead of a regularly defined atom (the previous lld approach). This closely models the reality of a function that will be resolved at runtime by the dynamic linker and loader itself (ld.so). I was tempted to force LLD to link against ld.so itself to resolve these symbols, but since GNU ld does not need the ld.so library to resolve this symbol, I decided to mimic its behavior and keep hardwired a definition of __tls_get_addr in the lld code. This patch also moves some important logic that previously was only available to the MIPS lld backend to be used to all ELF backends. This logic, which now lives in the DefaultLayout class, will monitor which external (shared lib) symbols are really imported by the current module and will only populate the dynamic symbol table with used symbols, as opposed to the previous approach of dumping all shared lib symbols in the dynamic symbol table. This is important to this patch to avoid __tls_get_addr from getting injected into all dynamic symbol tables. By solving the previous problem of always adding __tls_get_addr, now the produced symbol tables are slightly smaller. But this impacted several tests that relied on hardwired/predefined sizes of the symbol table, requiring this patch to update such tests. Test Plan: Added a LIT test case that exercises a simple use case of TLS variable in a shared library. Reviewers: ruiu, rafael, Bigcheese, shankarke Reviewed By: Bigcheese, shankarke Subscribers: emaste, shankarke, joerg, kledzik, mcrosier, llvm-commits Projects: #lld Differential Revision: http://reviews.llvm.org/D5505 llvm-svn: 218633
2014-09-30 06:05:26 +08:00
OMAGICSECTIONS: Size: 504
OMAGICSECTIONS: Link: 13
OMAGICSECTIONS: Info: 2
OMAGICSECTIONS: AddressAlignment: 8
OMAGICSECTIONS: EntrySize: 24
OMAGICSECTIONS: }
OMAGICSECTIONS: Section {
OMAGICSECTIONS: Name: .strtab
OMAGICSECTIONS: Type: SHT_STRTAB (0x3)
OMAGICSECTIONS: Flags [ (0x0)
OMAGICSECTIONS: ]
OMAGICSECTIONS: Address: 0x0
[lld] [ELF] Support for general dynamic TLS relocations on X86_64 Summary: This patch adds support for the general dynamic TLS access model for X86_64 (see www.akkadia.org/drepper/tls.pdf). To properly support TLS, the patch also changes the __tls_get_addr atom to be a shared library atom instead of a regularly defined atom (the previous lld approach). This closely models the reality of a function that will be resolved at runtime by the dynamic linker and loader itself (ld.so). I was tempted to force LLD to link against ld.so itself to resolve these symbols, but since GNU ld does not need the ld.so library to resolve this symbol, I decided to mimic its behavior and keep hardwired a definition of __tls_get_addr in the lld code. This patch also moves some important logic that previously was only available to the MIPS lld backend to be used to all ELF backends. This logic, which now lives in the DefaultLayout class, will monitor which external (shared lib) symbols are really imported by the current module and will only populate the dynamic symbol table with used symbols, as opposed to the previous approach of dumping all shared lib symbols in the dynamic symbol table. This is important to this patch to avoid __tls_get_addr from getting injected into all dynamic symbol tables. By solving the previous problem of always adding __tls_get_addr, now the produced symbol tables are slightly smaller. But this impacted several tests that relied on hardwired/predefined sizes of the symbol table, requiring this patch to update such tests. Test Plan: Added a LIT test case that exercises a simple use case of TLS variable in a shared library. Reviewers: ruiu, rafael, Bigcheese, shankarke Reviewed By: Bigcheese, shankarke Subscribers: emaste, shankarke, joerg, kledzik, mcrosier, llvm-commits Projects: #lld Differential Revision: http://reviews.llvm.org/D5505 llvm-svn: 218633
2014-09-30 06:05:26 +08:00
OMAGICSECTIONS: Offset: 0x3E0
OMAGICSECTIONS: Size: 231
OMAGICSECTIONS: Link: 0
OMAGICSECTIONS: Info: 0
OMAGICSECTIONS: AddressAlignment: 1
OMAGICSECTIONS: EntrySize: 0
OMAGICSECTIONS: }
OMAGICSECTIONS: ]
OMAGICPROGRAMHEADERS: ProgramHeaders [
OMAGICPROGRAMHEADERS: ProgramHeader {
OMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1)
OMAGICPROGRAMHEADERS: Offset: 0x0
OMAGICPROGRAMHEADERS: VirtualAddress: 0x400000
OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000
OMAGICPROGRAMHEADERS: FileSize: 324
OMAGICPROGRAMHEADERS: MemSize: 324
OMAGICPROGRAMHEADERS: Flags [ (0x7)
OMAGICPROGRAMHEADERS: PF_R (0x4)
OMAGICPROGRAMHEADERS: PF_W (0x2)
OMAGICPROGRAMHEADERS: PF_X (0x1)
OMAGICPROGRAMHEADERS: ]
OMAGICPROGRAMHEADERS: Alignment: 8
OMAGICPROGRAMHEADERS: }
OMAGICPROGRAMHEADERS: ProgramHeader {
OMAGICPROGRAMHEADERS: Type: PT_TLS (0x7)
OMAGICPROGRAMHEADERS: Offset: 0x138
OMAGICPROGRAMHEADERS: VirtualAddress: 0x400138
OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400138
OMAGICPROGRAMHEADERS: FileSize: 4
OMAGICPROGRAMHEADERS: MemSize: 12
OMAGICPROGRAMHEADERS: Flags [ (0x6)
OMAGICPROGRAMHEADERS: PF_R (0x4)
OMAGICPROGRAMHEADERS: PF_W (0x2)
OMAGICPROGRAMHEADERS: ]
OMAGICPROGRAMHEADERS: Alignment: 4
OMAGICPROGRAMHEADERS: }
OMAGICPROGRAMHEADERS: ]