This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
xstormy16: Fix handling of pc-relative relocs against defined symbols
- From: Nick Clifton <nickc at redhat dot com>
- To: binutils at sources dot redhat dot com
- Date: 02 May 2003 13:35:24 +0100
- Subject: xstormy16: Fix handling of pc-relative relocs against defined symbols
Hi Guys,
Sanyo has reported that GAS for the xstormy16 will generate bad
relocations for pc-relative relocs against already defined global
symbols. I tracked the bug down to md_apply_fix3 which was adding
in the symbols's value to the reloc's addend, even though this will
be done by the generic code.
Fixed by applying the patch below, and checked by adding the
attached test case to the linker. (To ensure that the relocs are
resolved correctly as well as generated correctly).
Cheers
Nick
gas/ChangeLog
2003-05-02 Nick Clifton <nickc@redhat.com>
* config/tc-xstormy16.c (xstormy16_md_apply_fix3): Do not bias the
addend with the symbol's value for pc-relative relocations against
a defined symbol - this will be done automatically.
ld/testsuite/ChangeLog
2003-05-02 Nick Clifton <nickc@redhat.com>
* ld-xstormy16: New directory.
* ld-xstormy16/xstormy16.exp: New test script.
* ld-xstormy16/pcrel.s: Test assembler source file.
* ld-xstormy16/external.s: Test assembler source file.
* ld-xstormy16/pcrel.d: Test expected disassembly.
Index: gas/config/tc-xstormy16.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-xstormy16.c,v
retrieving revision 1.9
diff -c -3 -p -w -r1.9 tc-xstormy16.c
*** gas/config/tc-xstormy16.c 23 Jan 2003 12:51:05 -0000 1.9
--- gas/config/tc-xstormy16.c 2 May 2003 12:30:51 -0000
*************** xstormy16_md_apply_fix3 (fixP, valueP, s
*** 556,562 ****
/* Tuck `value' away for use by tc_gen_reloc.
See the comment describing fx_addnumber in write.h.
! This field is misnamed (or misused :-). */
fixP->fx_addnumber += value;
}
--- 556,566 ----
/* Tuck `value' away for use by tc_gen_reloc.
See the comment describing fx_addnumber in write.h.
! This field is misnamed (or misused :-).
! We do not do this for pc-relative relocs against a
! defined symbol, since it will be done for us. */
! if ((! fixP->fx_pcrel)
! || (fixP->fx_addsy && ! S_IS_DEFINED (fixP->fx_addsy)))
fixP->fx_addnumber += value;
}
*** /dev/null 2003-01-30 10:24:37.000000000 +0000
--- xstormy16.exp 2003-05-02 13:18:28.000000000 +0100
***************
*** 0 ****
--- 1,38 ----
+ # Expect script for ld-xstormy16 tests
+ # Copyright (C) 2003 Free Software Foundation
+ #
+ # This file is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ #
+
+ # Test xstormy16 linking of pc-relative relocs. This tests the assembler and
+ # tools like objdump as well as the linker.
+
+ if {!([istarget "xstormy16*-*-*"]) } {
+ return
+ }
+
+ # Set up a list as described in ld-lib.exp
+
+ set xstormy16_tests {
+ { "xstormy16 pc-relative relocs linker test"
+ ""
+ ""
+ { "pcrel.s" "external.s" }
+ { {objdump -Dz pcrel.d} }
+ "pcrel"
+ }
+ }
+
+ run_ld_link_tests $xstormy16_tests
*** /dev/null 2003-01-30 10:24:37.000000000 +0000
--- pcrel.s 2003-05-02 13:13:59.000000000 +0100
***************
*** 0 ****
--- 1,31 ----
+ .text
+ .global _start
+ _start:
+ mov 0, # external
+ mov 0, # global
+ mov 0, # local
+
+ mov 0, # external - .
+ mov 0, # global - .
+ mov 0, # local - .
+
+ bc external
+ bc global
+ bc local
+
+ bc rx, #0, external
+ bc rx, #0, global
+ bc rx, #0, local
+
+ bc r0, #0, external
+ bc r0, #0, global
+ bc r0, #0, local
+
+ bc r0, r1, external
+ bc r0, r1, global
+ bc r0, r1, local
+ .global global
+ global:
+ nop
+ local:
+ nop
*** /dev/null 2003-01-30 10:24:37.000000000 +0000
--- external.s 2003-05-02 13:14:19.000000000 +0100
***************
*** 0 ****
--- 1,5 ----
+ .text
+ .global external
+ external:
+ nop
+
\ No newline at end of file
*** /dev/null 2003-01-30 10:24:37.000000000 +0000
--- pcrel.d 2003-05-02 13:21:57.000000000 +0100
***************
*** 0 ****
--- 1,34 ----
+
+ .*: file format elf32-xstormy16
+
+ Disassembly of section .data:
+ Disassembly of section .text:
+
+ 00008000 <_start>:
+ 8000: 00 79 46 80 mov.w 0x0,#0x8046
+ 8004: 00 79 42 80 mov.w 0x0,#0x8042
+ 8008: 00 79 44 80 mov.w 0x0,#0x8044
+ 800c: 00 79 2c 00 mov.w 0x0,#0x2c
+ 8010: 00 79 32 00 mov.w 0x0,#0x32
+ 8014: 00 79 30 00 mov.w 0x0,#0x30
+ 8018: 2c d3 bc 0x8046
+ 801a: 26 d3 bc 0x8042
+ 801c: 26 d3 bc 0x8044
+ 801e: 24 c3 00 00 bc Rx,#0x0,0x8046
+ 8022: 1c c3 00 00 bc Rx,#0x0,0x8042
+ 8026: 1a c3 00 00 bc Rx,#0x0,0x8044
+ 802a: 00 20 18 30 bc r0,#0x0,0x8046
+ 802e: 00 20 10 30 bc r0,#0x0,0x8042
+ 8032: 00 20 0e 30 bc r0,#0x0,0x8044
+ 8036: 10 0d 0c 30 bc r0,r1,0x8046
+ 803a: 10 0d 04 30 bc r0,r1,0x8042
+ 803e: 10 0d 02 30 bc r0,r1,0x8044
+
+ 00008042 <global>:
+ 8042: 00 00 nop
+
+ 00008044 <local>:
+ 8044: 00 00 nop
+
+ 00008046 <external>:
+ 8046: 00 00 nop