<div class="gmail_quote">2012/4/15 "Jérôme M. Berger" <span dir="ltr"><<a href="mailto:jeberger@free.fr">jeberger@free.fr</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">H. S. Teoh wrote:<br>
> I made a one-function library called mylib.a, that exports a single<br>
> function 'mylibfunc'. Then I wrote some code in aux.c that calls<br>
> 'mylibfunc', and then in main.c, I define a different version of<br>
> 'mylibfunc' along with main(). Here's the result of various orderings of<br>
> the linker command-line (each .c file is compiled with gcc -c<br>
> beforehand):<br>
><br>
> 1) ld mylib.a aux.o main.o<br>
>       Works, main's version of 'mylibfunc' is picked up<br>
><br>
> 2) ld aux.o mylib.a main.o<br>
>       Fails: ld complains that 'mylibfunc' is multiply defined<br>
><br>
> 3) ld aux.o main.o mylib.a<br>
>       Works, main's version of 'mylibfunc' is picked up<br>
><br>
> 4) ld main.o aux.o mylib.a<br>
>       Works, main's version of 'mylibfunc' is picked up<br>
><br>
> So here's my understanding of what happens:<br>
><br>
> For (1), ld doesn't even care about mylib.a because there are no<br>
> unresolved symbols to resolve yet. Then it sees aux.o, which has<br>
> unresolved reference to 'mylibfunc', then it sees main.o, which resolves<br>
> this symbol, so it finishes successfully.<br>
><br>
> For (2), ld sees aux.o first, which has unresolved symbol 'mylibfunc',<br>
> so it searches mylib.a next, and finds 'mylibfunc' in mylib.a, so it<br>
> links that in. Now when it sees main.o next, it sees 'mylibfunc' again,<br>
> and complains that it's already been defined.<br>
><br>
> For (3), ld sees aux.o first, which references unresolved symbol<br>
> 'mylibfunc', then it sees main.o, which defines 'mylibfunc', so now all<br>
> symbols are resolved. So when it sees mylib.a next, it does nothing 'cos<br>
> there are no more symbols to resolve. So this leaves us with main's<br>
> version of 'mylibfunc' linked.<br>
><br>
> For (4), ld sees main.o first, which exports 'mylibfunc', so when it<br>
> sees aux.o next, which references 'mylibfunc', it resolves it to main's<br>
> version of 'mylibfunc'. Then it sees mylib.a but does nothing because<br>
> all symbols have already been resolved.<br>
><br>
> Conclusion: defining your own version of library functions work... if<br>
> you link the library after your own version. If the library's version<br>
> gets picked up first, the linker will complain about duplicate symbols.<br>
><br>
</div></div>        In addition to what you have just said, there is another subtility.<br>
If either main.o or aux.o references another symbol mylibfunc2, and<br>
if both mylibfunc and mylibfunc2 are provided by the *same* object<br>
file inside mylib.a, then when the linker pulls in mylibfunc2 it<br>
will *also* pull in mylibfunc and complain about a duplicate<br>
definition. This also depends on your version of the compiler and<br>
linker, and on the compilation options (I believe the<br>
-ffunction-sections gcc option makes the issue disappear for example).<br>
<br>
                Jerome<br>
<span class="HOEnZb"><font color="#888888">--<br>
mailto:<a href="mailto:jeberger@free.fr">jeberger@free.fr</a><br>
<a href="http://jeberger.free.fr" target="_blank">http://jeberger.free.fr</a><br>
Jabber: <a href="mailto:jeberger@jabber.fr">jeberger@jabber.fr</a><br>
<br>
</font></span></blockquote></div><br><div>Wow. This all sounds... really unpredictable. I think I prefer the multiply defined symbols complaint, then I know, and I can deal with it appropriately. Having weird subtle rules to resolve this stuff seems far too likely to go wrong/break in a way that may either be undetected, or the programmer doesn't understand. :/ .. But fair enough.</div>
<div><br></div><div>How does weak linkage fit into this? If it finds a weak symbol while scanning for an unresolved symbol, will it then continue scanning when it finds the weak symbol, just in case there may be another strong one in there somewhere?</div>
<div><br></div><div>But basically, in order to override druntime implementations of functions in the way walter suggests, I need to carefully craft my linker commend line, and it should be work as he says? (not clear whether I should link the libs at the start or the end of the command line)</div>
<div>Perhaps it would be safer to use weak linkage for those functions in druntime that one may want to override, and then document the possibility? .. It feels somewhat like an exploit otherwise :)</div>