From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31613 invoked by alias); 12 Nov 2004 09:41:18 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 31581 invoked from network); 12 Nov 2004 09:41:10 -0000 Received: from unknown (HELO mail.codesourcery.com) (65.74.133.9) by sourceware.org with SMTP; 12 Nov 2004 09:41:10 -0000 Received: (qmail 28662 invoked from network); 12 Nov 2004 09:41:09 -0000 Received: from 81-178-247-39.dsl.pipex.com (HELO wren.home) (paul@81.178.247.39) by mail.codesourcery.com with RC4-MD5 encrypted SMTP; 12 Nov 2004 09:41:09 -0000 From: Paul Brook Organization: CodeSourcery To: binutils@sources.redhat.com Subject: [arm] Resolve R_ARM_PREL31 Date: Fri, 12 Nov 2004 09:41:00 -0000 User-Agent: KMail/1.7 Cc: Richard Earnshaw MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200411120941.07992.paul@codesourcery.com> X-SW-Source: 2004-11/txt/msg00202.txt.bz2 The R_ARM_PREL31 relocation should be resolved to the PTL entry for external symbols, and not written into shared objects. Patch below implements this. Tested with cross to arm-none-eabi, and light testing on arm-none-symbianelf. Ok? 2004-11-11 Paul Brook * bfd/elf32-arm.c (elf32_arm_final_link_relocate): Resolve R_ARM_PREL31 relocations to PLT entries. (elf32_arm_relocate_section, elf32_arm_gc_sweep_hook): Ditto. (elf32_arm_check_relocs): Ditto. Index: bfd/elf32-arm.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-arm.c,v retrieving revision 1.5 diff -u -p -r1.5 elf32-arm.c --- bfd/elf32-arm.c 9 Nov 2004 16:50:38 -0000 1.5 +++ bfd/elf32-arm.c 12 Nov 2004 01:49:40 -0000 @@ -2288,11 +2288,7 @@ elf32_arm_final_link_relocate (reloc_how will use the symbol's value, which may point to a PLT entry, but we don't need to handle that here. If we created a PLT entry, all branches in this object should go to it. */ - if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32 -#ifndef OLD_ARM_ABI - && r_type != R_ARM_PREL31 -#endif - ) + if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32) && h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1) @@ -2314,11 +2310,8 @@ elf32_arm_final_link_relocate (reloc_how into the output file to be resolved at run time. */ if (info->shared && (input_section->flags & SEC_ALLOC) - && ((r_type != R_ARM_REL32 -#ifndef OLD_ARM_ABI - && r_type != R_ARM_PREL31 -#endif - ) || !SYMBOL_CALLS_LOCAL (info, h)) + && (r_type != R_ARM_REL32 + || !SYMBOL_CALLS_LOCAL (info, h)) && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak) @@ -2326,6 +2319,7 @@ elf32_arm_final_link_relocate (reloc_how #ifndef OLD_ARM_ABI && r_type != R_ARM_CALL && r_type != R_ARM_JUMP24 + && r_type != R_ARM_PREL31 #endif && r_type != R_ARM_PLT32) { @@ -3197,6 +3191,7 @@ elf32_arm_relocate_section (bfd * #ifndef OLD_ARM_ABI case R_ARM_CALL: case R_ARM_JUMP24: + case R_ARM_PREL31: #endif case R_ARM_ABS32: case R_ARM_THM_PC22: @@ -3888,9 +3883,6 @@ elf32_arm_gc_sweep_hook (bfd * h->plt.refcount -= 1; if (r_type == R_ARM_ABS32 -#ifndef OLD_ARM_ABI - || r_type == R_ARM_PREL31 -#endif || r_type == R_ARM_REL32) { eh = (struct elf32_arm_link_hash_entry *) h; @@ -4039,6 +4031,7 @@ elf32_arm_check_relocs (bfd *abfd, struc #ifndef OLD_ARM_ABI || r_type == R_ARM_CALL || r_type == R_ARM_JUMP24 + || r_type == R_ARM_PREL31 #endif || r_type == R_ARM_PLT32) h->needs_plt = 1; @@ -4153,9 +4146,6 @@ elf32_arm_check_relocs (bfd *abfd, struc } if (r_type == R_ARM_ABS32 -#ifndef OLD_ARM_ABI - || r_type == R_ARM_PREL31 -#endif || r_type == R_ARM_REL32) p->count += 1; }