static link problems with alias
Carmelo Amoroso
carmelo73@gmail.com
Mon Jan 8 16:42:00 GMT 2007
More information about the Binutils mailing list
Mon Jan 8 16:42:00 GMT 2007
- Previous message (by thread): static link problems with alias
- Next message (by thread): static link problems with alias
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 1/8/07, Nick Clifton <nickc@redhat.com> wrote: > Hi Carmelo, > > > I've encountered a problem doing a static link due to duplicated symbols > > error. > > You appear to misunderstand how aliases and libraries work... probably... > > > I have the following dummy functions: > > - int foo(); > > - foo_alias() as weak alias of foo() > > - int bar(); (thats call foo_alias()) > > all archived into libfoo_alias.a > > Note that in your libfoo_alias.a you have a *strong* definition of a > symbol called "foo" and a *weak* definition of a symbol called "foo_alias". > > > and the following ones: > > > > int foo(); > > int other(); > > archied into libfoo.a > > Note that in libfoo.a you have a *second* strong definition of a symbol > called "foo". > yes, it's wanted... I'm trying to reproduce a more complicated scenario > > and the main.c calling bar() and other(). > > > > When I compile the main with the following command: > > > > gcc -static -L. main.c -lfoo_alias -lfoo I get the following error: > > > > ./libfoo.a(foo.o)(.text+0x0): In function `foo': > > : multiple definition of `foo' > > ./libfoo_alias.a(foo_alias.o)(.text+0x0): first defined here > > Which is quite correct. It goes like this: > > 1) main calls bar. bar is defined in libfoo_alias:bar.o > > 2) bar calls foo_alias. foo_alias is weakly defined in > libfoo_alias:foo.o, but there are no strong definitions provided > elsewhere, so the weak definition is used. Hence libfoo_alias:foo.o is > included in the link which brings with it a strong definition of the > "foo" symbol. > I tried also having foo_alias() a strong alias: does it make any changes? > 3) main calls other. other is defined in libfoo.a:foo.o. > libfoo.a:foo.o also defines "foo", hence there is now a duplicate > definition. > Ok, thanks for your detailed explanation.. what I don't understand if why if libfoo_alias:bar calls foo instead of the alias, having always to strong definitions of foo(), the link works fine. Could you explain the path in this case? > What you probably wanted was the following: > > 1) Edit foo.c and add these lines to the end: > > int foo_alias () { > return 2; > } > > This provides a strong definition of the foo_alias symbol which can > override the weak definition in foo_alias.c. > No, this is not what I wanted > 2) Change the gcc link command line to: > > gcc -static -L. main.c -lfoo -lfoo_alias > > ie moving the linking of libfoo.a to before libfoo_alias.a so that > the strong definition of foo_alias is available when the reference to it > is encountered in libfoo_alias:bar.o. > > Cheers > Nick > Thanks, Carmelo
- Previous message (by thread): static link problems with alias
- Next message (by thread): static link problems with alias
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list