diff options
author | Ian Lance Taylor <iant@google.com> | 2007-12-07 00:59:31 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-12-07 00:59:31 +0000 |
commit | 78d911fd3eb0d9f7ed7ab9dcf24f97c58278db4a (patch) | |
tree | 5ca77123074664a0fafe169a275f9716585e5a68 /gold | |
parent | ac1f0c21aefc3dc1b7c05c97e011d0eec0756cb9 (diff) | |
download | ppe42-binutils-78d911fd3eb0d9f7ed7ab9dcf24f97c58278db4a.tar.gz ppe42-binutils-78d911fd3eb0d9f7ed7ab9dcf24f97c58278db4a.zip |
From Cary Coutant: Some x86_64 shared library fixes.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/x86_64.cc | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 24f87b962c..cb687302f9 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -478,9 +478,9 @@ unsigned char Output_data_plt_x86_64::first_plt_entry[plt_entry_size] = { // From AMD64 ABI Draft 0.98, page 76 0xff, 0x35, // pushq contents of memory address - 0, 0, 0, 0, // replaced with address of .got + 4 - 0xff, 0x25, // jmp indirect 0, 0, 0, 0, // replaced with address of .got + 8 + 0xff, 0x25, // jmp indirect + 0, 0, 0, 0, // replaced with address of .got + 16 0x90, 0x90, 0x90, 0x90 // noop (x4) }; @@ -518,14 +518,11 @@ Output_data_plt_x86_64::do_write(Output_file* of) elfcpp::Elf_types<32>::Elf_Addr got_address = this->got_plt_->address(); memcpy(pov, first_plt_entry, plt_entry_size); - if (!parameters->output_is_shared()) - { - // We do a jmp relative to the PC at the end of this instruction. - elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 8 - - (plt_address + 6)); - elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 16 - - (plt_address + 12)); - } + // We do a jmp relative to the PC at the end of this instruction. + elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 8 + - (plt_address + 6)); + elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 16 + - (plt_address + 12)); pov += plt_entry_size; unsigned char* got_pov = got_view; @@ -546,14 +543,10 @@ Output_data_plt_x86_64::do_write(Output_file* of) { // Set and adjust the PLT entry itself. memcpy(pov, plt_entry, plt_entry_size); - if (parameters->output_is_shared()) - // FIXME(csilvers): what's the right thing to write here? - elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset); - else - elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, - (got_address + got_offset - - (plt_address + plt_offset - + 6))); + elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, + (got_address + got_offset + - (plt_address + plt_offset + + 6))); elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_index); elfcpp::Swap<32, false>::writeval(pov + 12, @@ -1044,7 +1037,7 @@ Target_x86_64::Scan::global(const General_options& options, target->make_plt_entry(symtab, layout, gsym); // Make a dynamic relocation if necessary. bool is_function_call = (gsym->type() == elfcpp::STT_FUNC); - if (gsym->needs_dynamic_reloc(true, is_function_call)) + if (gsym->needs_dynamic_reloc(false, is_function_call)) { if (target->may_need_copy_reloc(gsym)) { |