gecko-dev/build/unix/elfhack
Mike Hommey 48eba8560c Bug 1385783 - Insert the elfhack code before the first executable section. r=froydnj
The lld linker creates separate segments for purely executable sections
(such as .text) and sections preceding those (such as .rel.dyn). Neither
gold nor bfd ld do that, and just put all those sections in the same
executable segment.

Since elfhack is putting its executable code between the two relocation
sections, it ends up in a non-executable segment, leading to a crash
when it's time to run that code.

We thus insert the elfhack code before the first executable section
instead of between the two relocation sections (which is where the
elfhack data lies, and stays).

--HG--
extra : rebase_source : ab18eb9ac518d69a8639ad0e785741395b662112
2017-08-02 16:39:12 +09:00
..
inject Bug 1379835 - Don't filter out -idirafter flag when building elfhack injected code. r=gps 2017-07-11 08:02:16 +09:00
dummy.c
elf.cpp Bug 1378986 - Adjust the fake phdr section properly. r=froydnj 2017-07-07 18:29:06 +09:00
elfhack.cpp Bug 1385783 - Insert the elfhack code before the first executable section. r=froydnj 2017-08-02 16:39:12 +09:00
elfxx.h Bug 635961 - Allow elfhack to relocate data under the GNU_RELRO segment. r=froydnj 2017-07-11 07:41:07 +09:00
inject.c Bug 635961 - Allow elfhack to relocate data under the GNU_RELRO segment. r=froydnj 2017-07-11 07:41:07 +09:00
Makefile.in Bug 1385910 - In the error message, also ask to upload the pre-elfhacked library r=froydnj 2017-07-31 16:35:03 +02:00
moz.build
README
test-array.c
test-ctors.c
test.c Bug 1385117 - Make the bss section of the elfhack testcase large enough. r=froydnj 2017-07-28 07:15:39 +09:00

Elfhack is a program to optimize ELF binaries for size and cold startup
speed.

Presently, it is quite experimental, though it works well for the target
it was created for: Firefox's libxul.so.

Elfhack currently only does one thing: packing dynamic relocations ;
which ends up being a quite complex task, that can be summarized this
way:
- Remove RELATIVE relocations from the .rel.dyn/.rela.dyn section.
- Inject a small code able to apply relative relocations "by hand"
  after the .rel.dyn/.rela.dyn section.
- Inject a section containing relocative relocations in a different
  and more packed format, after the small code.
- Register the small code as DT_INIT function. Make the small code call
  what was initially the DT_INIT function, if there was one.
- Remove the hole between the new section containing relative
  relocations and the following sections, adjusting offsets and base
  addresses accordingly.
- Adjust PT_LOAD entries to fit new offsets, and add an additional
  PT_LOAD entry when that is necessary to handle the discrepancy between
  offsets and base addresses, meaning the section offsets may yet again
  need adjustments.
- Adjust various DT_* dynamic tags to fit the new ELF layout.
- Adjust section headers.
- Adjust ELF headers.

See http://glandium.org/blog/?p=1177#relocations for some figures.