summaryrefslogtreecommitdiffstats
path: root/src/elf.h
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-03-07 21:08:34 (GMT)
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-03-07 21:08:34 (GMT)
commitc4deb5e9e1ce9c98a48e0d5bb37d87739b8cfee4 (patch)
tree7f83a5bcb3a791c5ae5a7553af9e11f39e33d451 /src/elf.h
parentc1f89c077e44a495c62ed0dcfaeca21510df93ef (diff)
downloadpatchelf-c4deb5e9e1ce9c98a48e0d5bb37d87739b8cfee4.zip
patchelf-c4deb5e9e1ce9c98a48e0d5bb37d87739b8cfee4.tar.gz
patchelf-c4deb5e9e1ce9c98a48e0d5bb37d87739b8cfee4.tar.bz2
Avoid inflating file sizes needlessly and allow binaries to be stripped
The current approach to changing sections in ET_DYN executables is to move the INTERP section to the end of the file. +This means changing PT_PHDR to add an extra PT_LOAD section so that the new section is mmaped into memory by the elf loader in the kernel. In order to extend PHDR, this means moving it to the end of the file. Its documented in BUGS there is a kernel 'bug' which means that if you have holes in memory between the base load address and the PT_LOAD segment that contains PHDR, it will pass an incorrect PHDR address to ld.so and fail to load the binary, segfaulting. To avoid this, the code currently inserts space into the binary to ensure that when loaded into memory there are no holes between the PT_LOAD sections. This inflates the binaries by many MBs in some cases. Whilst we could make them sparse, there is a second issue which is that strip can fail to process these binaries: $ strip fixincl Not enough room for program headers, try linking with -N [.note.ABI-tag]: Bad value This turns out to be due to libbfd not liking the relocated PHDR section either (https://github.com/NixOS/patchelf/issues/10). Instead this patch implements a different approach, leaving PHDR where it is but extending it in place to allow addition of a new PT_LOAD section. This overwrites sections in the binary but those get moved to the end of the file in the new PT_LOAD section. This is based on patches linked from the above github issue, however whilst the idea was good, the implementation wasn't correct and they've been rewritten here. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'src/elf.h')
0 files changed, 0 insertions, 0 deletions