[PATCH v2 1/2] x86: allow @size to also (sensibly) apply to sections

H.J. Lu hjl.tools@gmail.com
Wed Apr 28 11:56:24 GMT 2021


On Wed, Apr 28, 2021 at 1:56 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.
> ---
> v2: Add -h to objdump options in test cases.
>
> --- 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
> @@ -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
> --- 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
> @@ -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
>

OK.

Thanks.

-- 
H.J.


More information about the Binutils mailing list