diff options
| author | Davide Italiano <davide@freebsd.org> | 2015-05-01 00:07:11 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2015-05-01 00:07:11 +0000 |
| commit | 0e4a3addf08aaa9e4ab7291e83a4edcd69d51071 (patch) | |
| tree | f2af2f075f2a773d0a14e8d9300040effe232624 | |
| parent | 2127b00cd5d4058bb315220ae64b021219f7ef5b (diff) | |
| download | bcm5719-llvm-0e4a3addf08aaa9e4ab7291e83a4edcd69d51071.tar.gz bcm5719-llvm-0e4a3addf08aaa9e4ab7291e83a4edcd69d51071.zip | |
[ELF] Mark linker defined symbols as .hidden when needed.
I noticed that gold mark these as hidden. While at it I rewrote the test for
this feature to use yaml rather than an object file as input.
Differential Revision: http://reviews.llvm.org/D9418
Reviewed by: ruiu
llvm-svn: 236291
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ELFFile.cpp | 7 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ELFFile.h | 2 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ExecutableWriter.h | 12 | ||||
| -rw-r--r-- | lld/test/elf/Inputs/init_array.x86-64 | bin | 3440 -> 0 bytes | |||
| -rw-r--r-- | lld/test/elf/X86_64/omagic.test | 2 | ||||
| -rw-r--r-- | lld/test/elf/init_array.test | 96 |
6 files changed, 104 insertions, 15 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ELFFile.cpp b/lld/lib/ReaderWriter/ELF/ELFFile.cpp index 14442a7a584..fd2ef716e67 100644 --- a/lld/lib/ReaderWriter/ELF/ELFFile.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFFile.cpp @@ -741,14 +741,17 @@ bool ELFFile<ELFT>::redirectReferenceUsingUndefAtom( } template <class ELFT> -void RuntimeFile<ELFT>::addAbsoluteAtom(StringRef symbolName) { +void RuntimeFile<ELFT>::addAbsoluteAtom(StringRef symbolName, bool isHidden) { assert(!symbolName.empty() && "AbsoluteAtoms must have a name"); Elf_Sym *sym = new (this->_readerStorage) Elf_Sym; sym->st_name = 0; sym->st_value = 0; sym->st_shndx = llvm::ELF::SHN_ABS; sym->setBindingAndType(llvm::ELF::STB_GLOBAL, llvm::ELF::STT_OBJECT); - sym->setVisibility(llvm::ELF::STV_DEFAULT); + if (isHidden) + sym->setVisibility(llvm::ELF::STV_HIDDEN); + else + sym->setVisibility(llvm::ELF::STV_DEFAULT); sym->st_size = 0; ELFAbsoluteAtom<ELFT> *atom = this->createAbsoluteAtom(symbolName, sym, -1); this->addAtom(*atom); diff --git a/lld/lib/ReaderWriter/ELF/ELFFile.h b/lld/lib/ReaderWriter/ELF/ELFFile.h index f519450c2af..93ade6b0cc3 100644 --- a/lld/lib/ReaderWriter/ELF/ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/ELFFile.h @@ -398,7 +398,7 @@ public: : ELFFile<ELFT>(name, ctx) {} /// \brief add a global absolute atom - virtual void addAbsoluteAtom(StringRef symbolName); + virtual void addAbsoluteAtom(StringRef symbolName, bool isHidden = false); /// \brief add an undefined atom virtual void addUndefinedAtom(StringRef symbolName); diff --git a/lld/lib/ReaderWriter/ELF/ExecutableWriter.h b/lld/lib/ReaderWriter/ELF/ExecutableWriter.h index de65be40c81..d4c38add14a 100644 --- a/lld/lib/ReaderWriter/ELF/ExecutableWriter.h +++ b/lld/lib/ReaderWriter/ELF/ExecutableWriter.h @@ -81,10 +81,10 @@ std::unique_ptr<RuntimeFile<ELFT>> ExecutableWriter<ELFT>::createRuntimeFile() { file->addAbsoluteAtom("__bss_end"); file->addAbsoluteAtom("_end"); file->addAbsoluteAtom("end"); - file->addAbsoluteAtom("__preinit_array_start"); - file->addAbsoluteAtom("__preinit_array_end"); - file->addAbsoluteAtom("__init_array_start"); - file->addAbsoluteAtom("__init_array_end"); + file->addAbsoluteAtom("__preinit_array_start", true); + file->addAbsoluteAtom("__preinit_array_end", true); + file->addAbsoluteAtom("__init_array_start", true); + file->addAbsoluteAtom("__init_array_end", true); if (this->_ctx.isRelaOutputFormat()) { file->addAbsoluteAtom("__rela_iplt_start"); file->addAbsoluteAtom("__rela_iplt_end"); @@ -92,8 +92,8 @@ std::unique_ptr<RuntimeFile<ELFT>> ExecutableWriter<ELFT>::createRuntimeFile() { file->addAbsoluteAtom("__rel_iplt_start"); file->addAbsoluteAtom("__rel_iplt_end"); } - file->addAbsoluteAtom("__fini_array_start"); - file->addAbsoluteAtom("__fini_array_end"); + file->addAbsoluteAtom("__fini_array_start", true); + file->addAbsoluteAtom("__fini_array_end", true); return file; } diff --git a/lld/test/elf/Inputs/init_array.x86-64 b/lld/test/elf/Inputs/init_array.x86-64 Binary files differdeleted file mode 100644 index 2425c227fd4..00000000000 --- a/lld/test/elf/Inputs/init_array.x86-64 +++ /dev/null diff --git a/lld/test/elf/X86_64/omagic.test b/lld/test/elf/X86_64/omagic.test index 437d2e2a9f9..270625eb3e8 100644 --- a/lld/test/elf/X86_64/omagic.test +++ b/lld/test/elf/X86_64/omagic.test @@ -187,7 +187,7 @@ OMAGICSECTIONS: Address: 0x0 OMAGICSECTIONS: Offset: 0x1E8 OMAGICSECTIONS: Size: 504 OMAGICSECTIONS: Link: 13 -OMAGICSECTIONS: Info: 2 +OMAGICSECTIONS: Info: 8 OMAGICSECTIONS: AddressAlignment: 8 OMAGICSECTIONS: EntrySize: 24 OMAGICSECTIONS: } diff --git a/lld/test/elf/init_array.test b/lld/test/elf/init_array.test index 1acf4a7e7a2..7e038835031 100644 --- a/lld/test/elf/init_array.test +++ b/lld/test/elf/init_array.test @@ -1,6 +1,92 @@ -RUN: lld -flavor gnu -target x86_64-linux -o %t %p/Inputs/init_array.x86-64 \ -RUN: -e __init_array_start -RUN: llvm-objdump -t -section-headers %t | FileCheck %s +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor gnu -target x86_64-linux %t.o -o %t1 -e=main +#RUN: llvm-objdump -t -section-headers %t | FileCheck %s -CHECK: .init_array {{[0-9]+}} [[ADDR:[0-9]+]] -CHECK: [[ADDR]] g *ABS* {{[0-9]+}} __init_array_start +#CHECK: .init_array {{[0-9]+}} [[ADDR:[0-9]+]] +#CHECK: [[ADDR]] l *ABS* {{[0-9]+}} .hidden __init_array_start + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B800000000C745FC000000008B0C2500000000894DF85DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000013 + Symbol: a + Type: R_X86_64_32S + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '05000000' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000017A5200017810011B0C0708900100001C0000001C000000000000001C00000000410E108602430D0600000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: a + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000004 + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x000000000000001C +... |

