Summary: | ELF linker failed to handle relocation against STN_UNDEF | ||
---|---|---|---|
Product: | binutils | Reporter: | Stefan Reinauer <stepan> |
Component: | ld | Assignee: | Alan Modra <amodra> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | bug-binutils, hjl.tools |
Priority: | P2 | ||
Version: | 2.17 | ||
Target Milestone: | --- | ||
Host: | i586-suse-linux | Target: | i586-suse-linux |
Build: | i586-suse-linux | Last reconfirmed: |
Description
Stefan Reinauer
2007-02-02 14:22:59 UTC
We have bash-3.1$ cat foo.s SEGMENT_SIZE = 0x10000 RVECTOR = 0x00010 .code16 .globl _start _start: #jmp 0xfef0 jmp SEGMENT_SIZE-(0x1f00 +0xf0 +RVECTOR) bash-3.1$ gcc -c -m32 foo.s bash-3.1$ ./objdump -Mi8086 -dr foo.o foo.o: file format elf32-i386 Disassembly of section .text: 00000000 <_start>: 0: e9 fe df jmp ffffe001 <SEGMENT_SIZE+0xfffee001> 1: R_386_PC16 *ABS* That is a relocation against ABS section. But many ELF linkers have if (r_symndx == 0) { /* r_symndx will be zero only for relocs against symbols from removed linkonce sections, or sections discarded by a linker script. For these relocs, we just want the section contents zeroed. Avoid any special processing. */ _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); continue; } The above comment and code are certainly incorrect for this testcase. A patch is posted at http://sourceware.org/ml/binutils/2007-02/msg00036.html I can confirm that the right binary output is produced in my case when this patch is applied. (In reply to comment #3) > I can confirm that the right binary output is produced in my case when this > patch is applied. Are you running binutils on a 64bit OS? Relocation against STN_UNDEF is well defined by the gABI. Here is the updated patch: http://sourceware.org/ml/binutils/2007-03/msg00029.html |