<div dir="ltr"><span style="font-size:12.8px">On Thu, Sep 3, 2015 at 8:44 PM, Joerg Sonnenberger via llvm-commits <</span><br style="font-size:12.8px"><a href="mailto:llvm-commits@lists.llvm.org" style="font-size:12.8px">llvm-commits@lists.llvm.org</a><span style="font-size:12.8px">> wrote:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">> I think I agree with Joerg. When we are just using a DSO, it doesn't make</span><br style="font-size:12.8px"><span style="font-size:12.8px">> sense to warn on undefined symbols in the DSO.</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">> Your test case looks like it's testing against that</span><br style="font-size:12.8px"><span style="font-size:12.8px">> case. libfoo_unresolved-symbols.so has undefined symbols in it, and the</span><br style="font-size:12.8px"><span style="font-size:12.8px">> test is testing if LLD print error messages on it when linking against</span><br style="font-size:12.8px"><span style="font-size:12.8px">> libfoo_unresolved-symbols.so.</span><br><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Let us take a use case below:</span></div><div><span style="font-size:12.8px">$cat main.c</span></div><div><div style=""><span style="font-size:12.8px">#include <stdio.h></span></div><div style=""><div style="font-size:12.8px">extern int var;</div><div style=""><div style=""><span style="font-size:12.8px">int main() {</span></div></div><div style=""><div style="font-size:12.8px">   printf("main: %d\n",var);</div><div style="font-size:12.8px"><span style="font-size:12.8px">   return 0;</span><br></div><div style="font-size:12.8px">}</div><div style="font-size:12.8px"><br></div><div style=""><span style="font-size:12.8px">$cat foo.c</span></div><div style=""><span style="font-size:12.8px">int var = 10;</span><br></div><div style=""><span style="font-size:12.8px">extern int bar();</span></div><div style=""><span style="font-size:12.8px">int foo() {</span></div><div style=""><span style="font-size:12.8px">   bar();</span></div><div style=""><span style="font-size:12.8px">   return 0;</span></div><div style=""><span style="font-size:12.8px">}</span></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style=""><span style="font-size:12.8px">$gcc -shared -fpic foo.c -o libfoo.so</span><br></div><div style=""><div style="font-size:12.8px">$gcc main.c -L. -lfoo</div><div style="font-size:12.8px">./libfoo.so: undefined reference to `bar'</div><div style="font-size:12.8px">collect2: error: ld returned 1 exit status</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">In above example because of data variable var, libfoo.so is in DT_NEEDED list and so gnu linker (as well as gold linker) is reporting error (default) for undefined reference bar() called from foo() even if foo() is not being referenced.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div style="font-size:12.8px"><span style="font-size:12.8px">in case of gnu ld and gold, allow shlib undefined is false (default) while creating executable and true while creating shared library (-shared option).</span><br></div><div><span style="font-size:12.8px"><br></span></div></div><div style="font-size:12.8px">For same test case lld does not report any error. </div><div style="font-size:12.8px"><span style="font-size:12.8px">This is because lld implementation has default allow shlib undefined true. </span><br></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">is this defect in lld? or lld is designed with this awareness?</span><br></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px">While creating executable, if the library is not in the DT_NEEDED list then lld should not report undefined reference from that library, even with any option. I will fix this with --unresolved-symbols option implementation. (Will fix the test case as well).</div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">But above mentioned different behavior of lld compared to gnu ld and gold is critical to resolve.</span><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">This information clarity is important for implementation of -Bgroup, -static, -z now, --[warn|error]-unresolved-symbols options.</div><div style="font-size:12.8px"><br></div><div style=""><span style="font-size:12.8px"><a href="http://reviews.llvm.org/D12226#238177">http://reviews.llvm.org/D12226#238177</a></span><br></div><div style=""><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px">-Shridhar</div><div><br></div></div><div style=""><span style="font-size:12.8px"><br></span></div></div></div></div></div>