x86: allow @size to also (sensibly) apply to sections
authorJan Beulich <jbeulich@suse.com>
Thu, 29 Apr 2021 09:43:53 +0000 (11:43 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 29 Apr 2021 09:43:53 +0000 (11:43 +0200)
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/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/size-2.d
gas/testsuite/gas/i386/size-2.s
gas/testsuite/gas/i386/x86-64-size-2.d

index 5d341e8004e9f622dcd099ba285475ffec1f38a0..e36170a2f91c5e9811493396da1e9dce8fbd5d3f 100644 (file)
@@ -1,3 +1,11 @@
+2021-04-29  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.
+
 2021-04-28  Jan Beulich  <jbeulich@suse.com>
             H.J. Lu  <hjl.tools@gmail.com>
 
index bd2da65bece4ff1bdc6721d63193f334bfbc4734..9c544ee231de3ecd2e065f30c7aec1b523ee90ca 100644 (file)
@@ -14241,7 +14241,11 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
        {
          /* 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))
index 685720b3c50051797483237d848b8170f929c7fb..38b96f68f229bac5d1d44a6aa0965709f71dec30 100644 (file)
@@ -1,10 +1,14 @@
 #name: i386 size 2
-#objdump: -dwr
-
+#objdump: -dhwr
 
 .*: +file format .*
 
-
+Sections:
+Idx Name +Size .*
+  0 \.text +0*3c .*
+  1 \.data +0*5c .*
+  2 \.bss +0*199999(ae|b0) .*
+#...
 Disassembly of section .text:
 
 0+ <.text>:
@@ -17,4 +21,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
index 09f8f4724b2c17b459dc07f09356340a91c3721b..b1f814a376546bfa133b1db495c4ed5c7e547a30 100644 (file)
@@ -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
index f144c4780b5ff0bc71a3b10fffd37319335c49bf..2c49d5307c7d958fbc0aed9c2f18ee32548743ba 100644 (file)
@@ -1,11 +1,15 @@
 #name: x86-64 size 2
 #source: size-2.s
-#objdump: -dwr
-
+#objdump: -dhwr
 
 .*: +file format .*
 
-
+Sections:
+Idx Name +Size .*
+  0 \.text +0*3c .*
+  1 \.data +0*5c .*
+  2 \.bss +0*199999(ae|b0) .*
+#...
 Disassembly of section .text:
 
 0+ <.text>:
@@ -18,4 +22,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