[PATCH] change the condition preventing symbol replacement in snapshot_symbol()

Nick Clifton nickc@redhat.com
Mon Jul 27 16:49:00 GMT 2009
Hi Jan,

> The question is whether an equate counts as a local symbol.

> I'd really hope that Alan and or Nick could jump in here clarifying expected
> behavior.

I didn't reply because I do not know the answer.

The documentation already states that equating one symbol with another 
is the same as using the .set directive.  The .set directive says that 
the new symbol inherits the value and type of the original symbol.  Thus 
one would expect that in:

   .global foo
   bar = foo

That bar behaves like a global symbol, not a local one.

We can change the documentation of course, and as H.J. has already 
pointed out, if foo is defined then the current behaviour is to treat 
bar as a local symbol.

To me though this seems wrong.  As a programmer I would expect that 
equated symbols are the same.  Ie that they can be treated as aliases of 
each other.  I do not see the benefit of changing the nature of equated 
symbol.

I extended H.J.'s demonstration slightly:

   bar = foo
   baz = globule

         .globl foo
         .globl globule
   foo:
         jmp bar
         jmp foo
         jmp baz
         jmp globule

Which when assembled and dumped with objdump -dr gives:

00000000 <foo>:
    0:   eb fe                   jmp    0 <foo>
    2:   e9 fc ff ff ff          jmp    3 <foo+0x3>
                         3: R_386_PC32   foo
    7:   e9 fc ff ff ff          jmp    8 <foo+0x8>
                         8: R_386_PC32   globule
    c:   e9 fc ff ff ff          jmp    d <foo+0xd>
                         d: R_386_PC32   globule

The first jmp just seems plain wrong to me.  I would expect it to have a 
relocation against the foo symbol just like all of the others.

So, in my opinion: "no, equating a symbol does not make it local".

Cheers
   Nick



More information about the Binutils mailing list