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:
>>
>> Hey,
>>
>> 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
>>
>> Joseph
For ELF,
* 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