[PATCH] D39348: Implement --just-symbols.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 15 18:07:36 PST 2017
This still doesn't handle the --just-symbols file being the only input,
no?
Cheers,
Rafael
Rui Ueyama via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> ruiu updated this revision to Diff 127195.
> ruiu added a comment.
>
> - Copy symbol type, size, binding, etc. when creating an absolute symbol.
>
>
> https://reviews.llvm.org/D39348
>
> Files:
> lld/ELF/Driver.cpp
> lld/ELF/InputFiles.cpp
> lld/ELF/InputFiles.h
> lld/ELF/Options.td
> lld/test/ELF/Inputs/just-symbols.s
> lld/test/ELF/just-symbols.s
>
> Index: lld/test/ELF/just-symbols.s
> ===================================================================
> --- /dev/null
> +++ lld/test/ELF/just-symbols.s
> @@ -0,0 +1,17 @@
> +# 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 %t2
> +# RUN: ld.lld %t2 -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
> + ret
> Index: lld/test/ELF/Inputs/just-symbols.s
> ===================================================================
> --- /dev/null
> +++ lld/test/ELF/Inputs/just-symbols.s
> @@ -0,0 +1,9 @@
> +.globl foo, bar
> +foo:
> + ret
> +
> +.section .data
> +.type bar, @object
> +.size bar, 40
> +bar:
> + .zero 40
> Index: lld/ELF/Options.td
> ===================================================================
> --- lld/ELF/Options.td
> +++ lld/ELF/Options.td
> @@ -153,6 +153,8 @@
> defm init: Eq<"init">, HelpText<"Specify an initializer function">,
> MetaVarName<"<symbol>">;
>
> +defm just_symbols: Eq<"just-symbols">, HelpText<"Just link symbols">;
> +
> defm library: Eq<"library">, HelpText<"Root name of library to use">,
> MetaVarName<"<libName>">;
>
> Index: lld/ELF/InputFiles.h
> ===================================================================
> --- lld/ELF/InputFiles.h
> +++ lld/ELF/InputFiles.h
> @@ -58,6 +58,9 @@
> // Opens a given file.
> llvm::Optional<MemoryBufferRef> readFile(StringRef Path);
>
> +// For --just-symbols.
> +template <class ELFT> void readJustSymbolsFile(MemoryBufferRef);
> +
> // The root class of input files.
> class InputFile {
> public:
> Index: lld/ELF/InputFiles.cpp
> ===================================================================
> --- lld/ELF/InputFiles.cpp
> +++ lld/ELF/InputFiles.cpp
> @@ -1116,6 +1116,43 @@
> }
> }
>
> +// 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 <class ELFT> 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<ELFT> Obj = check(ELFFile<ELFT>::create(MB.getBuffer()));
> + ArrayRef<Elf_Shdr> 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 FirstNonLocal = Sec.sh_info;
> + StringRef StringTable =
> + CHECK(Obj.getStringTableForSymtab(Sec, Sections), ObjName);
> +
> + std::vector<std::pair<StringRef, uint64_t>> Ret;
> + for (const Elf_Sym &Sym : Syms.slice(FirstNonLocal))
> + if (Sym.st_shndx != SHN_UNDEF)
> + Symtab->addRegular<ELFT>(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<ELF32LE>();
> template void ArchiveFile::parse<ELF32BE>();
> template void ArchiveFile::parse<ELF64LE>();
> @@ -1150,3 +1187,8 @@
> template void BinaryFile::parse<ELF32BE>();
> template void BinaryFile::parse<ELF64LE>();
> template void BinaryFile::parse<ELF64BE>();
> +
> +template void elf::readJustSymbolsFile<ELF32LE>(MemoryBufferRef);
> +template void elf::readJustSymbolsFile<ELF32BE>(MemoryBufferRef);
> +template void elf::readJustSymbolsFile<ELF64LE>(MemoryBufferRef);
> +template void elf::readJustSymbolsFile<ELF64BE>(MemoryBufferRef);
> Index: lld/ELF/Driver.cpp
> ===================================================================
> --- lld/ELF/Driver.cpp
> +++ lld/ELF/Driver.cpp
> @@ -1033,6 +1033,12 @@
> for (StringRef S : Config->Undefined)
> Symtab->fetchIfLazy<ELFT>(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<MemoryBufferRef> MB = readFile(Arg->getValue()))
> + readJustSymbolsFile<ELFT>(*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.
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list