This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gold patch] Fix problems with mixed PIC/non-PIC objects in PIE output


When building a PIE executable with mixed PIC and non-PIC input files,
a non-PIC call to a shared library function will result in a dynamic
relocation on the call. If there is also a PIC call to the same
symbol, a PLT entry will have been created, and the logic for
determining if a dynamic relocation is necessary will erroneously
return false. If the non-PIC call precedes the PIC call,
Symbol::needs_dynamic_reloc() will return true during scanning (before
the PIC call is seen), and false when applying relocations (after the
PIC call was scanned). For targets that use REL relocations (namely
i386), this causes gold to apply the static relocation instead of
leaving the original addend intact. This patch fixes the test in
needs_dynamic_reloc() to check for output_is_position_independent
instead of shared.

In addition, a non-PIC reference to data in a shared library will
result in the creation of a COPY relocation, but no dynamic relocation
for the reference to the new home. I checked how Gnu ld behaves, and
it does not appear to make COPY relocs for PIE executables. This patch
also changes Symbol::may_need_copy_reloc() to test for
output_is_position_independent.

The new test case covers both of these problems.

Tested on i386 and x86_64 (although x86_64 doesn't run the non-PIC-in-PIE test).

OK?

-cary


        * symtab.h (Symbol::needs_dynamic_reloc): Non-PIC calls from
        position-independent executables to shared libraries need dynamic
        relocations.
        (Symbol::may_need_copy_reloc): Do not generate COPY relocs in
        position-independent executables.
        * testsuite/Makefile.am (two_file_mixed_pie_test): New test.
        * testsuite/Makefile.in: Regenerate.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]