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] |
According to ARM's AAELF document, section A.3, we can just use an add/ldr combination if we only need to go <2^20 bytes away from PLT to PLTGOT (the common case). This patch does that. Comments welcome, this is my first binutils patch. It adds these failures: FAIL: Simple non-PIC shared library FAIL: Simple PIC shared library FAIL: Simple dynamic application FAIL: Non-pcrel function reference FAIL: Thumb shared library with ARM entry points FAIL: Mixed ARM/Thumb shared library FAIL: Mixed ARM/Thumb dynamic application FAIL: Mixed ARM/Thumb arch5 dynamic application The tests need to be updated to match the new PLT. New tests should be written to test for a GOT entry being >=2^20 bytes from its PLT entry. Adam -- Index: bfd/elf32-arm.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-arm.c,v retrieving revision 1.196 diff -u -3 -p -r1.196 elf32-arm.c --- bfd/elf32-arm.c 22 May 2009 11:58:44 -0000 1.196 +++ bfd/elf32-arm.c 23 May 2009 14:10:28 -0000 @@ -1937,6 +1937,15 @@ static const bfd_vma elf32_arm_plt_entry 0x00000000, /* unused */ }; +/* Or sometimes like this. */ +static const bfd_vma elf32_arm_near_plt_entry [] = + { + 0xe28fca00, /* add ip, pc, #NN */ + 0xe5bcf000, /* ldr pc, [ip, #NN]! */ + 0x00000000, /* unused */ + 0x00000000, /* unused */ + }; + #else /* The first entry in a procedure linkage table looks like @@ -1961,6 +1970,14 @@ static const bfd_vma elf32_arm_plt_entry 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */ }; +/* Or sometimes like this. */ +static const bfd_vma elf32_arm_near_plt_entry [] = + { + 0xe28fca00, /* add ip, pc, #0xNN000 */ + 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */ + 0x00000000, /* unused */ + }; + #endif /* The format of the first entry in the procedure linkage table @@ -12022,21 +12039,39 @@ elf32_arm_finish_dynamic_symbol (bfd * o elf32_arm_plt_thumb_stub[1], ptr - 2); } - put_arm_insn (htab, output_bfd, - elf32_arm_plt_entry[0] - | ((got_displacement & 0x0ff00000) >> 20), - ptr + 0); - put_arm_insn (htab, output_bfd, - elf32_arm_plt_entry[1] - | ((got_displacement & 0x000ff000) >> 12), - ptr+ 4); - put_arm_insn (htab, output_bfd, - elf32_arm_plt_entry[2] - | (got_displacement & 0x00000fff), - ptr + 8); + if (got_displacement >= 0x100000) + { + put_arm_insn (htab, output_bfd, + elf32_arm_plt_entry[0] + | ((got_displacement & 0x0ff00000) >> 20), + ptr + 0); + put_arm_insn (htab, output_bfd, + elf32_arm_plt_entry[1] + | ((got_displacement & 0x000ff000) >> 12), + ptr + 4); + put_arm_insn (htab, output_bfd, + elf32_arm_plt_entry[2] + | (got_displacement & 0x00000fff), + ptr + 8); #ifdef FOUR_WORD_PLT - bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12); + bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12); #endif + } + else + { + put_arm_insn (htab, output_bfd, + elf32_arm_near_plt_entry[0] + | ((got_displacement & 0x000ff000) >> 12), + ptr + 0); + put_arm_insn (htab, output_bfd, + elf32_arm_near_plt_entry[1] + | (got_displacement & 0x00000fff), + ptr + 4); + bfd_put_32 (output_bfd, elf32_arm_near_plt_entry[2], ptr + 8); +#ifdef FOUR_WORD_PLT + bfd_put_32 (output_bfd, elf32_arm_near_plt_entry[3], ptr + 12); +#endif + } } /* Fill in the entry in the global offset table. */
Attachment:
signature.asc
Description: OpenPGP digital signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |