[6/8] x86: allow @size to also (sensibly) apply to sections

Message ID 6a12b496-245b-c899-b0d0-506100017e54@suse.com
State New
Headers show
Series
  • x86: assorted relocation handling related adjustments (part II)
Related show

Commit Message

Roland McGrath via Binutils April 23, 2021, 8:37 a.m.
So far this (counter-intuitively) produced the size as recorded in the
(section) symbol. Obtain the section's size instead for section symbols.
(I wonder whether STT_SECTION symbols couldn't properly hold the
section's size in their st_size field, which in turn would likely mean
the internal symbol would also have its size properly updated.)

Note that this is not the same as the .sizeof.() pseudo-operator: @size
yields the local file's contribution to a section, while .sizeof.() gets
resolved by the linker to produce the final full section's size.

As to the 3rd each of the expected output lines in the changed testcase:
I can't find justification for zzz to come after yyy despite them being
defined in the opposite order in source. Therefore I think it's better
to permit both possible outcomes.

gas/
2021-04-XX  Jan Beulich  <jbeulich@suse.com>

	* config/tc-i386.c (tc_gen_reloc): Use section size for section
	symbols when resolving BFD_RELOC_SIZE*.
	* testsuite/gas/i386/size-2.s: Add section size cases.
	* testsuite/gas/i386/size-2.d,
	testsuite/gas/i386/x86-64-size-2.d: Adjust expectations.

Comments

Roland McGrath via Binutils April 23, 2021, 1:23 p.m. | #1
On Fri, Apr 23, 2021 at 1:37 AM Jan Beulich <jbeulich@suse.com> wrote:
>

> So far this (counter-intuitively) produced the size as recorded in the

> (section) symbol. Obtain the section's size instead for section symbols.

> (I wonder whether STT_SECTION symbols couldn't properly hold the

> section's size in their st_size field, which in turn would likely mean

> the internal symbol would also have its size properly updated.)

>

> Note that this is not the same as the .sizeof.() pseudo-operator: @size

> yields the local file's contribution to a section, while .sizeof.() gets

> resolved by the linker to produce the final full section's size.

>

> As to the 3rd each of the expected output lines in the changed testcase:

> I can't find justification for zzz to come after yyy despite them being

> defined in the opposite order in source. Therefore I think it's better

> to permit both possible outcomes.

>

> gas/

> 2021-04-XX  Jan Beulich  <jbeulich@suse.com>

>

>         * config/tc-i386.c (tc_gen_reloc): Use section size for section

>         symbols when resolving BFD_RELOC_SIZE*.

>         * testsuite/gas/i386/size-2.s: Add section size cases.

>         * testsuite/gas/i386/size-2.d,

>         testsuite/gas/i386/x86-64-size-2.d: Adjust expectations.

>

> --- a/gas/config/tc-i386.c

> +++ b/gas/config/tc-i386.c

> @@ -14239,7 +14239,11 @@ tc_gen_reloc (asection *section ATTRIBUT

>         {

>           /* Resolve size relocation against local symbol to size of

>              the symbol plus addend.  */

> -         valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;

> +         valueT value = S_GET_SIZE (fixp->fx_addsy);

> +

> +         if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_SECTION_SYM)

> +           value = bfd_section_size (S_GET_SEGMENT (fixp->fx_addsy));

> +         value += fixp->fx_offset;

>           if (fixp->fx_r_type == BFD_RELOC_SIZE32

>               && object_64bit

>               && !fits_in_unsigned_long (value))

> --- a/gas/testsuite/gas/i386/size-2.d

> +++ b/gas/testsuite/gas/i386/size-2.d

> @@ -17,4 +17,7 @@ Disassembly of section .text:

>  [      ]*[a-f0-9]+:    b8 90 99 99 19          mov    \$0x19999990,%eax

>  [      ]*[a-f0-9]+:    b8 70 99 99 19          mov    \$0x19999970,%eax

>  [      ]*[a-f0-9]+:    b8 b0 99 99 19          mov    \$0x199999b0,%eax

> +[      ]*[a-f0-9]+:    b8 3c 00 00 00          mov    \$0x3c,%eax

> +[      ]*[a-f0-9]+:    b8 60 00 00 00          mov    \$0x60,%eax

> +[      ]*[a-f0-9]+:    b8 (ae|b0) 99 99 09             mov    \$0x99999(ae|b0),%eax

>  #pass

> --- a/gas/testsuite/gas/i386/size-2.s

> +++ b/gas/testsuite/gas/i386/size-2.s

> @@ -9,6 +9,9 @@

>         movl    $zzz@SIZE, %eax

>         movl    $zzz@SIZE - 32, %eax

>         movl    $zzz@SIZE + 32, %eax

> +       movl    $.text@SIZE, %eax

> +       movl    $.data@SIZE + 4, %eax

> +       movl    $.bss@SIZE - 0x10000000, %eax

>         .local  zzz

>         .comm   zzz,429496720,32

>         .bss

> --- a/gas/testsuite/gas/i386/x86-64-size-2.d

> +++ b/gas/testsuite/gas/i386/x86-64-size-2.d

> @@ -18,4 +18,7 @@ Disassembly of section .text:

>  [      ]*[a-f0-9]+:    b8 90 99 99 19          mov    \$0x19999990,%eax

>  [      ]*[a-f0-9]+:    b8 70 99 99 19          mov    \$0x19999970,%eax

>  [      ]*[a-f0-9]+:    b8 b0 99 99 19          mov    \$0x199999b0,%eax

> +[      ]*[a-f0-9]+:    b8 3c 00 00 00          mov    \$0x3c,%eax


Is 0x3c the .text section size?

> +[      ]*[a-f0-9]+:    b8 60 00 00 00          mov    \$0x60,%eax


Is 0x60 the .data section size?

> +[      ]*[a-f0-9]+:    b8 (ae|b0) 99 99 09             mov    \$0x99999(ae|b0),%eax


Is the .bss section size 1?  Please update tests to verify section sizes.

>  #pass

>




-- 
H.J.
Roland McGrath via Binutils April 23, 2021, 1:30 p.m. | #2
On 23.04.2021 15:23, H.J. Lu wrote:
> On Fri, Apr 23, 2021 at 1:37 AM Jan Beulich <jbeulich@suse.com> wrote:

>> --- a/gas/testsuite/gas/i386/x86-64-size-2.d

>> +++ b/gas/testsuite/gas/i386/x86-64-size-2.d

>> @@ -18,4 +18,7 @@ Disassembly of section .text:

>>  [      ]*[a-f0-9]+:    b8 90 99 99 19          mov    \$0x19999990,%eax

>>  [      ]*[a-f0-9]+:    b8 70 99 99 19          mov    \$0x19999970,%eax

>>  [      ]*[a-f0-9]+:    b8 b0 99 99 19          mov    \$0x199999b0,%eax

>> +[      ]*[a-f0-9]+:    b8 3c 00 00 00          mov    \$0x3c,%eax

> 

> Is 0x3c the .text section size?


Yes.

>> +[      ]*[a-f0-9]+:    b8 60 00 00 00          mov    \$0x60,%eax

> 

> Is 0x60 the .data section size?


Yes.

>> +[      ]*[a-f0-9]+:    b8 (ae|b0) 99 99 09             mov    \$0x99999(ae|b0),%eax

> 

> Is the .bss section size 1?


No. Where are you seeing 1?

>  Please update tests to verify section sizes.


I'm afraid I have no clue what you mean by this.

Jan
Roland McGrath via Binutils April 23, 2021, 1:38 p.m. | #3
On Fri, Apr 23, 2021 at 6:30 AM Jan Beulich <jbeulich@suse.com> wrote:
>

> On 23.04.2021 15:23, H.J. Lu wrote:

> > On Fri, Apr 23, 2021 at 1:37 AM Jan Beulich <jbeulich@suse.com> wrote:

> >> --- a/gas/testsuite/gas/i386/x86-64-size-2.d

> >> +++ b/gas/testsuite/gas/i386/x86-64-size-2.d

> >> @@ -18,4 +18,7 @@ Disassembly of section .text:

> >>  [      ]*[a-f0-9]+:    b8 90 99 99 19          mov    \$0x19999990,%eax

> >>  [      ]*[a-f0-9]+:    b8 70 99 99 19          mov    \$0x19999970,%eax

> >>  [      ]*[a-f0-9]+:    b8 b0 99 99 19          mov    \$0x199999b0,%eax

> >> +[      ]*[a-f0-9]+:    b8 3c 00 00 00          mov    \$0x3c,%eax

> >

> > Is 0x3c the .text section size?

>

> Yes.

>

> >> +[      ]*[a-f0-9]+:    b8 60 00 00 00          mov    \$0x60,%eax

> >

> > Is 0x60 the .data section size?

>

> Yes.

>

> >> +[      ]*[a-f0-9]+:    b8 (ae|b0) 99 99 09             mov    \$0x99999(ae|b0),%eax

> >

> > Is the .bss section size 1?

>

> No. Where are you seeing 1?

>

> >  Please update tests to verify section sizes.

>

> I'm afraid I have no clue what you mean by this.

>


Please add -h to objdump to show the section header and check the
section sizes.

-- 
H.J.

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -14239,7 +14239,11 @@  tc_gen_reloc (asection *section ATTRIBUT
 	{
 	  /* Resolve size relocation against local symbol to size of
 	     the symbol plus addend.  */
-	  valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
+	  valueT value = S_GET_SIZE (fixp->fx_addsy);
+
+	  if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_SECTION_SYM)
+	    value = bfd_section_size (S_GET_SEGMENT (fixp->fx_addsy));
+	  value += fixp->fx_offset;
 	  if (fixp->fx_r_type == BFD_RELOC_SIZE32
 	      && object_64bit
 	      && !fits_in_unsigned_long (value))
--- a/gas/testsuite/gas/i386/size-2.d
+++ b/gas/testsuite/gas/i386/size-2.d
@@ -17,4 +17,7 @@  Disassembly of section .text:
 [ 	]*[a-f0-9]+:	b8 90 99 99 19       	mov    \$0x19999990,%eax
 [ 	]*[a-f0-9]+:	b8 70 99 99 19       	mov    \$0x19999970,%eax
 [ 	]*[a-f0-9]+:	b8 b0 99 99 19       	mov    \$0x199999b0,%eax
+[ 	]*[a-f0-9]+:	b8 3c 00 00 00       	mov    \$0x3c,%eax
+[ 	]*[a-f0-9]+:	b8 60 00 00 00       	mov    \$0x60,%eax
+[ 	]*[a-f0-9]+:	b8 (ae|b0) 99 99 09       	mov    \$0x99999(ae|b0),%eax
 #pass
--- a/gas/testsuite/gas/i386/size-2.s
+++ b/gas/testsuite/gas/i386/size-2.s
@@ -9,6 +9,9 @@ 
 	movl	$zzz@SIZE, %eax
 	movl	$zzz@SIZE - 32, %eax
 	movl	$zzz@SIZE + 32, %eax
+	movl	$.text@SIZE, %eax
+	movl	$.data@SIZE + 4, %eax
+	movl	$.bss@SIZE - 0x10000000, %eax
 	.local	zzz
 	.comm	zzz,429496720,32
 	.bss
--- a/gas/testsuite/gas/i386/x86-64-size-2.d
+++ b/gas/testsuite/gas/i386/x86-64-size-2.d
@@ -18,4 +18,7 @@  Disassembly of section .text:
 [ 	]*[a-f0-9]+:	b8 90 99 99 19       	mov    \$0x19999990,%eax
 [ 	]*[a-f0-9]+:	b8 70 99 99 19       	mov    \$0x19999970,%eax
 [ 	]*[a-f0-9]+:	b8 b0 99 99 19       	mov    \$0x199999b0,%eax
+[ 	]*[a-f0-9]+:	b8 3c 00 00 00       	mov    \$0x3c,%eax
+[ 	]*[a-f0-9]+:	b8 60 00 00 00       	mov    \$0x60,%eax
+[ 	]*[a-f0-9]+:	b8 (ae|b0) 99 99 09       	mov    \$0x99999(ae|b0),%eax
 #pass