This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PR12519 ELF .size expressions
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Date: Sat, 26 Feb 2011 00:10:26 +1030
- Subject: PR12519 ELF .size expressions
Fixes code handling ELF .size expressions that can't be evaluated
immediately for some reasone, for example if the .size directive was
given at the beginning of the function referencing a label at the end
of the function. Also corrects a couple of errors in the testsuite
that the old .size code wrongly accepted.
gas/
PR gas/12519
* config/obj-elf.c (elf_frob_symbol): Properly handle size expression.
ld/testsuite/
* ld-mn10300/i135409-3.s: Correct .size label reference.
* ld-sh/sh64/stolib.s: Likewise.
Index: gas/config/obj-elf.c
===================================================================
RCS file: /cvs/src/src/gas/config/obj-elf.c,v
retrieving revision 1.136
diff -u -p -r1.136 obj-elf.c
--- gas/config/obj-elf.c 18 Nov 2010 16:00:25 -0000 1.136
+++ gas/config/obj-elf.c 25 Feb 2011 13:27:51 -0000
@@ -1,6 +1,6 @@
/* ELF object file format
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@@ -1889,23 +1889,11 @@ elf_frob_symbol (symbolS *symp, int *pun
if (sy_obj->size != NULL)
{
- switch (sy_obj->size->X_op)
- {
- case O_subtract:
- S_SET_SIZE (symp,
- (S_GET_VALUE (sy_obj->size->X_add_symbol)
- + sy_obj->size->X_add_number
- - S_GET_VALUE (sy_obj->size->X_op_symbol)));
- break;
- case O_constant:
- S_SET_SIZE (symp,
- (S_GET_VALUE (sy_obj->size->X_add_symbol)
- + sy_obj->size->X_add_number));
- break;
- default:
- as_bad (_(".size expression too complicated to fix up"));
- break;
- }
+ if (resolve_expression (sy_obj->size)
+ && sy_obj->size->X_op == O_constant)
+ S_SET_SIZE (symp, sy_obj->size->X_add_number);
+ else
+ as_bad (_(".size expression does not evaluate to a constant"));
free (sy_obj->size);
sy_obj->size = NULL;
}
Index: ld/testsuite/ld-mn10300/i135409-3.s
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-mn10300/i135409-3.s,v
retrieving revision 1.1
diff -u -p -r1.1 i135409-3.s
--- ld/testsuite/ld-mn10300/i135409-3.s 13 Nov 2007 10:40:27 -0000 1.1
+++ ld/testsuite/ld-mn10300/i135409-3.s 25 Feb 2011 13:27:51 -0000
@@ -10,7 +10,7 @@ A:
BOTTOM:
.balign 0x8
add D0,D1
- .size _func, .-func
+ .size _func, .-_func
.data
L001:
Index: ld/testsuite/ld-sh/sh64/stolib.s
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-sh/sh64/stolib.s,v
retrieving revision 1.1
diff -u -p -r1.1 stolib.s
--- ld/testsuite/ld-sh/sh64/stolib.s 15 Oct 2003 06:23:55 -0000 1.1
+++ ld/testsuite/ld-sh/sh64/stolib.s 25 Feb 2011 13:27:51 -0000
@@ -4,4 +4,4 @@
bar:
ptabs r18, tr0
blink tr0, r63
- .Lfe_bar: .size bar,.Lfe_bar-X
+.Lfe_bar: .size bar,.Lfe_bar-bar
--
Alan Modra
Australia Development Lab, IBM