When creating a dynamic executable and receiving the -E flag, the linker should export all globally visible symbols in its dynamic symbol table. This commit also moves the logic that exports symbols in the dynamic symbol table from OutputELFWriter to the ExecutableWriter class. It is not correct to leave this at OutputELFWriter because DynamicLibraryWriter, another subclass of OutputELFWriter, already exports all symbols, meaning we can potentially end up with duplicated symbols in the dynamic symbol table when creating shared libs. Reviewers: shankarke http://reviews.llvm.org/D5585 llvm-svn: 219334
100 lines
3.0 KiB
Plaintext
100 lines
3.0 KiB
Plaintext
# Tests the --export-dynamic (-E) flag. When creating a dynamic executable and
|
|
# receiving this flag, the linker should export all globally visible symbols in
|
|
# its dynamic symbol table.
|
|
|
|
#RUN: yaml2obj -format=elf %s -o=%t.o
|
|
#RUN: lld -flavor gnu -target x86_64 -E %t.o -e=main -o %t1
|
|
#RUN: llvm-readobj -dt %t1 | FileCheck -check-prefix CHECKSYMS %s
|
|
|
|
#CHECKSYMS: myfunc1@
|
|
#CHECKSYMS: main@
|
|
#CHECKSYMS: myvar1@
|
|
|
|
# The object file below was generated with the following code:
|
|
#
|
|
# (command line clang -c prog.c -o prog.o)
|
|
#
|
|
# int myvar1 = 22;
|
|
#
|
|
# static int mysecretvar = 11;
|
|
#
|
|
# int myfunc1() {
|
|
# return 23;
|
|
# }
|
|
#
|
|
# static int mysecretfunc() {
|
|
# return 42;
|
|
# }
|
|
#
|
|
# int main() {
|
|
# return mysecretfunc() + mysecretvar;
|
|
# }
|
|
---
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
OSABI: ELFOSABI_GNU
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
|
AddressAlign: 0x0000000000000010
|
|
Content: 554889E5B8170000005DC30F1F440000554889E54883EC10C745FC00000000E81C000000030425000000004883C4105DC36666666666662E0F1F840000000000554889E5B82A0000005DC3
|
|
- Name: .rela.text
|
|
Type: SHT_RELA
|
|
Link: .symtab
|
|
AddressAlign: 0x0000000000000008
|
|
Info: .text
|
|
Relocations:
|
|
- Offset: 0x0000000000000027
|
|
Symbol: .data
|
|
Type: R_X86_64_32S
|
|
Addend: 4
|
|
- Name: .data
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_WRITE, SHF_ALLOC ]
|
|
AddressAlign: 0x0000000000000004
|
|
Content: 160000000B000000
|
|
- Name: .bss
|
|
Type: SHT_NOBITS
|
|
Flags: [ SHF_WRITE, SHF_ALLOC ]
|
|
AddressAlign: 0x0000000000000004
|
|
Content: ''
|
|
Symbols:
|
|
Local:
|
|
- Name: mysecretfunc
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
Value: 0x0000000000000040
|
|
Size: 0x000000000000000B
|
|
- Name: mysecretvar
|
|
Type: STT_OBJECT
|
|
Section: .data
|
|
Value: 0x0000000000000004
|
|
Size: 0x0000000000000004
|
|
- Name: .text
|
|
Type: STT_SECTION
|
|
Section: .text
|
|
- Name: .data
|
|
Type: STT_SECTION
|
|
Section: .data
|
|
- Name: .bss
|
|
Type: STT_SECTION
|
|
Section: .bss
|
|
Global:
|
|
- Name: main
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
Value: 0x0000000000000010
|
|
Size: 0x0000000000000021
|
|
- Name: myfunc1
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
Size: 0x000000000000000B
|
|
- Name: myvar1
|
|
Type: STT_OBJECT
|
|
Section: .data
|
|
Size: 0x0000000000000004
|