[PATCH] gas: copy st_size only if unset

Fangrui Song i@maskray.me
Fri Apr 1 01:33:43 GMT 2022


On 2022-03-31, Jan Beulich wrote:
>On 31.03.2022 05:37, Fangrui Song wrote:
>> For
>> ```
>> .size foo1, 1
>> foo1:
>>
>> .set bar1, foo1
>> .size bar1, 2
>> .size bar2, 2
>> .set bar2, foo1
>>
>> .set bar3, foo2
>> .size bar3, 2
>> .size bar4, 2
>> .set bar4, foo2
>>
>> .size foo2, 1
>> foo2:
>> ```
>>
>> bar1's size is 2 while bar2, bar3, bar4's is 1. The behavior of bar1 makes sense
>> (generally directives on the new symbol should win) and is relied upon by glibc
>> stdio-common/errlist.c:
>
>But what about
>
>foo1:
>	.size foo1, 1
>foo2:
>	.size foo2, 2
>	.set bar, foo1
>	.set bar, foo2
>
>I would think bar's size should end up being 2 in this case, whereas I
>think it would end up being 1 with your change.
>
>Jan

bar's size is 2. The patch has no effect, because `dest` variables for the two
invocations are (surprisingly) different!

bar is a volatile symbol (created by .set instead of .equiv). The
second .set directive creates calls gas.c/read.c:3273 symbol_clone (symbolP, 1).

That said, I think it makes sense to add tests for this as well.
I'll use the following if this patch is accepted.

   .text
   
   .size foo1, 1
   foo1:
   
   .set bar1, foo1
   .size bar1, 2
   .size bar2, 2
   .set bar2, foo1
   
   .set bar3, foo2
   .size bar3, 2
   .size bar4, 2
   .set bar4, foo2
   
   .set bar5, foo1
   .set bar6, foo2
   
   .size foo2, 3
   foo2:
   
   .set bar7, foo1
   .set bar7, foo2


More information about the Binutils mailing list