Fix problem where gold cannot build .eh_frame_hdr from ld -r output.
authorCary Coutant <ccoutant@gmail.com>
Mon, 21 Mar 2016 02:15:56 +0000 (19:15 -0700)
committerCary Coutant <ccoutant@gmail.com>
Mon, 21 Mar 2016 02:17:14 +0000 (19:17 -0700)
commit698400bfb91b3476d98edcb6a4bf5e4abe1c14cc
tree08b2a8c9742e5fafdca141f3f6561f9c7c25d0b3
parenta3b6c4db68dbcb24c454e6beaaf1002c1ca9e011
Fix problem where gold cannot build .eh_frame_hdr from ld -r output.

When running ld -r on objects that have comdat groups, when gold
deduplicates a function in a comdat group, it removes the relocations
from the EH information that referred to the dropped copy of the function.
When running a final link using the result of the -r link, the missing
relocation cause it to fail to recognize the FDE for the dropped
function.

This patch improves gold's FDE scanning to take into account the
possibility that an FDE corresponds to a dropped function, and drops
that FDE as well.

Gnu ld, on the other hand, leaves the relocations in the ld -r output,
but makes them R_NONE with an r_sym field of 0. This was sufficient to
let both linkers recognize the FDE properly.

With this fix, if you do an ld -r with gold, then do the final link with
Gnu ld, the .eh_frame_hdr section will not be generated. To make it work
with Gnu ld, we would have to leave the R_NONE relocations in, but I
think it's better to drop the relocations entirely. I'd hope that if
you're doing a -r link with gold, you'll also do the final link with
gold.

gold/
PR gold/19002
* ehframe.cc (Eh_frame::read_fde): Check for dropped functions.
* testsuite/Makefile.am (eh_test_2): New test.
* testsuite/Makefile.in: Regenerate.
* testsuite/eh_test_2.sh: New test script.
* testsuite/eh_test_a.cc (bar): Make it comdat.
* testsuite/eh_test_b.cc (bar): Add a duplicate copy.
gold/ChangeLog
gold/ehframe.cc
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/eh_test_2.sh [new file with mode: 0755]
gold/testsuite/eh_test_a.cc
gold/testsuite/eh_test_b.cc