[llvm-dev] Adding sections in a binary
Fangrui Song via llvm-dev
llvm-dev at lists.llvm.org
Thu Aug 13 11:14:26 PDT 2020
On 2020-08-13, David Blaikie via llvm-dev wrote:
>Sounds like the llvm-objcopy source code (llvm/tools/llvm-objcopy) is
>probably a good place to start.
>On Thu, Aug 13, 2020 at 8:11 AM Joseph via llvm-dev
><llvm-dev at lists.llvm.org> wrote:
>> LLVM has logic to parse ELF and PE binaries using `llvm::object::createBinary`. I tried to search in the codebase to see if there's a possibility to add/remove sections after parsing a binary and re-write the binary to another location. Basically, like what llvm-objcopy does. Can you point me to the right classes to look into, if this is something that LLVM has?
>> Many thanks
* adding a non-SHF_ALLOC section is simple. A non-SHF_ALLOC section is not part of
the memory image and not used by the program (unless for some rare
introspection use cases)
* adding a SHF_ALLOC section is difficult. You likely need to fix the
containing PT_LOAD segment. llvm-objcopy only does the base p_offset fix.
You need to take care p_vaddr/p_paddr/p_filesz/p_memsz by your self.
+ adding a section smaller than the known lowest address (ET_EXEC with a
non-zero image base) or larger than the known largest address:
The PT_LOAD fixes are doable.
+ adding a section within the existing address ranges: this is very difficult
due to many implicit inter-section references. If you have an advanced
binary rewriting tool, this is still doable, but definitely brittle.
File offsets (p_offset,sh_offset) can be reconstructed from addresses.
llvm-objcopy/ELF/Object.cpp layoutSections has some code.
A more sophisticated implementation is in the linker: lld/ELF/Writer.cpp assignFileOffsets
More information about the llvm-dev