Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -912,6 +912,12 @@ case OPT_no_whole_archive: InWholeArchive = false; break; + case OPT_just_symbols: + if (Optional MB = readFile(Arg->getValue())) { + Files.push_back(createObjectFile(*MB)); + Files.back()->JustSymbols = true; + } + break; case OPT_start_lib: InLib = true; break; @@ -1074,12 +1080,6 @@ for (StringRef S : Config->Undefined) Symtab->fetchIfLazy(S); - // Handle the --just-symbols option. This may add absolute symbols - // to the symbol table. - for (auto *Arg : Args.filtered(OPT_just_symbols)) - if (Optional MB = readFile(Arg->getValue())) - readJustSymbolsFile(*MB); - // If an entry symbol is in a static archive, pull out that file now // to complete the symbol table. After this, no new names except a // few linker-synthesized ones will be added to the symbol table. Index: lld/trunk/ELF/InputFiles.h =================================================================== --- lld/trunk/ELF/InputFiles.h +++ lld/trunk/ELF/InputFiles.h @@ -110,6 +110,9 @@ std::string getSrcMsg(const Symbol &Sym, InputSectionBase &Sec, uint64_t Offset); + // True if this is an argument for --just-symbols. Usually false. + bool JustSymbols = false; + protected: InputFile(Kind K, MemoryBufferRef M); std::vector Sections; @@ -201,6 +204,7 @@ void initializeSections(llvm::DenseSet &ComdatGroups); void initializeSymbols(); + void initializeJustSymbols(); void initializeDwarf(); InputSectionBase *getRelocTarget(const Elf_Shdr &Sec); InputSectionBase *createInputSection(const Elf_Shdr &Sec); @@ -340,9 +344,6 @@ uint64_t OffsetInArchive = 0); InputFile *createSharedFile(MemoryBufferRef MB, StringRef DefaultSoName); -// For --just-symbols -template void readJustSymbolsFile(MemoryBufferRef MB); - extern std::vector BinaryFiles; extern std::vector BitcodeFiles; extern std::vector ObjectFiles; Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -271,8 +271,13 @@ template void ObjFile::parse(DenseSet &ComdatGroups) { - // Read section and symbol tables. - initializeSections(ComdatGroups); + // Read a section table. JustSymbols is usually false. + if (this->JustSymbols) + initializeJustSymbols(); + else + initializeSections(ComdatGroups); + + // Read a symbol table. initializeSymbols(); } @@ -359,6 +364,27 @@ return true; } +// This is for --just-symbols. +// +// --just-symbols is a very minor feature that allows you to link your +// output against other existing program, so that if you load both your +// program and the other program into memory, your output can refer the +// other program's symbols. +// +// When the option is given, we link "just symbols". The section table is +// initialized with null pointers. +template void ObjFile::initializeJustSymbols() { + ArrayRef ObjSections = CHECK(this->getObj().sections(), this); + this->Sections.resize(ObjSections.size()); + + for (const Elf_Shdr &Sec : ObjSections) { + if (Sec.sh_type != SHT_SYMTAB) + continue; + this->initSymtab(ObjSections, &Sec); + return; + } +} + template void ObjFile::initializeSections( DenseSet &ComdatGroups) { @@ -1190,41 +1216,6 @@ } } -// This is for --just-symbols. -// -// This option allows you to link your output against other existing -// program, so that if you load both your program and the other program -// into memory, your output can use program's symbols. -// -// What we are doing here is to read defined symbols from a given ELF -// file and add them as absolute symbols. -template void elf::readJustSymbolsFile(MemoryBufferRef MB) { - typedef typename ELFT::Shdr Elf_Shdr; - typedef typename ELFT::Sym Elf_Sym; - typedef typename ELFT::SymRange Elf_Sym_Range; - - StringRef ObjName = MB.getBufferIdentifier(); - ELFFile Obj = check(ELFFile::create(MB.getBuffer())); - ArrayRef Sections = CHECK(Obj.sections(), ObjName); - - for (const Elf_Shdr &Sec : Sections) { - if (Sec.sh_type != SHT_SYMTAB) - continue; - - Elf_Sym_Range Syms = CHECK(Obj.symbols(&Sec), ObjName); - uint32_t FirstGlobal = Sec.sh_info; - StringRef StringTable = - CHECK(Obj.getStringTableForSymtab(Sec, Sections), ObjName); - - for (const Elf_Sym &Sym : Syms.slice(FirstGlobal)) - if (Sym.st_shndx != SHN_UNDEF) - Symtab->addRegular(CHECK(Sym.getName(StringTable), ObjName), - Sym.st_other, Sym.getType(), Sym.st_value, - Sym.st_size, Sym.getBinding(), nullptr, nullptr); - return; - } -} - template void ArchiveFile::parse(); template void ArchiveFile::parse(); template void ArchiveFile::parse(); @@ -1254,8 +1245,3 @@ template class elf::SharedFile; template class elf::SharedFile; template class elf::SharedFile; - -template void elf::readJustSymbolsFile(MemoryBufferRef); -template void elf::readJustSymbolsFile(MemoryBufferRef); -template void elf::readJustSymbolsFile(MemoryBufferRef); -template void elf::readJustSymbolsFile(MemoryBufferRef); Index: lld/trunk/test/ELF/Inputs/just-symbols.s =================================================================== --- lld/trunk/test/ELF/Inputs/just-symbols.s +++ lld/trunk/test/ELF/Inputs/just-symbols.s @@ -1,9 +0,0 @@ -.globl foo, bar -foo: - ret - -.section .data -.type bar, @object -.size bar, 40 -bar: - .zero 40 Index: lld/trunk/test/ELF/just-symbols-cref.s =================================================================== --- lld/trunk/test/ELF/just-symbols-cref.s +++ lld/trunk/test/ELF/just-symbols-cref.s @@ -0,0 +1,20 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -o %t1.exe -Ttext=0x10000 + +# RUN: ld.lld -just-symbols=%t1.exe -o %t2.exe -cref | FileCheck %s + +# CHECK: Symbol File +# CHECK-NEXT: bar {{.*exe}} +# CHECK-NEXT: foo {{.*exe}} + +.globl foo, bar +foo: + ret + +.section .data +.type bar, @object +.size bar, 40 +bar: + .zero 40 Index: lld/trunk/test/ELF/just-symbols.s =================================================================== --- lld/trunk/test/ELF/just-symbols.s +++ lld/trunk/test/ELF/just-symbols.s @@ -1,17 +1,20 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/just-symbols.s -o %t1 -# RUN: ld.lld %t1 -o %t1.exe -Ttext=0x10000 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -o %t1.exe -Ttext=0x10000 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2 -# RUN: ld.lld %t2 -just-symbols=%t1.exe -o %t2.exe +# RUN: ld.lld -just-symbols=%t1.exe -o %t2.exe # RUN: llvm-readelf -symbols %t2.exe | FileCheck %s # CHECK: 0000000000011000 40 OBJECT GLOBAL DEFAULT ABS bar # CHECK: 0000000000010000 0 NOTYPE GLOBAL DEFAULT ABS foo -.globl _start -_start: - call foo - call bar +.globl foo, bar +foo: ret + +.section .data +.type bar, @object +.size bar, 40 +bar: + .zero 40