<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">On Aug 8, 2013, at 4:53 PM, Bill Wendling <<a href="mailto:isanbard@gmail.com">isanbard@gmail.com</a>> wrote:<br><blockquote type="cite" dir="auto">On Aug 8, 2013, at 10:06 AM, Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br><blockquote type="cite">On 8 August 2013 12:46, Rafael Espíndola <rafael.espindola@gmail.com> wrote:<br><blockquote type="cite"><blockquote type="cite">I don't understand: how does output format affect symbol visibility?<br></blockquote><br><br>I agree.<br>This looks like a bug in the linker. It should be marking every symbol<br>as needed with -r, in which case internalize is a nop.<br></blockquote></blockquote>Okay. I reverted it for now.<br><br>Nick, Do you have an opinion on whether this is a linker issue?</blockquote><br><div>The linker already does tell LTO to preserve all global symbols in -r mode.  </div><div><br></div><div>Given that the original bug involved linker private symbols  (start with ‘l’), I made a test case of all combinations of weak, hidden, and linker private.  I did notice that the merging of bit code files happens as if the -keep_private_externs were used, but that should not matter.</div><div><br></div><div>Was does seem to be the problem is that the weak bit is lost on _weak_hidden_glob and l_weak_hidden_special.</div><div><br></div><div><font face="Monaco" size="1">[/tmp]> cat a.c<br><br>void glob() { }<br><br>__attribute__((weak))<br>void weak_glob() { }<br><br>__attribute__((visibility("hidden")))<br>void hidden_glob() { }<br><br>__attribute__((weak, visibility("hidden")))<br>void weak_hidden_glob() { }<br><br><br>extern void special() __asm("l_special");<br>void special() { }<br><br>extern void weak_special() __asm("l_weak_special");<br>__attribute__((weak))<br>void weak_special() { }<br><br>extern void hidden_special() __asm("l_hidden_special");<br>__attribute__((visibility("hidden")))<br>void hidden_special() { }<br><br>extern void weak_hidden_special() __asm("l_weak_hidden_special");<br>__attribute__((weak, visibility("hidden")))<br>void weak_hidden_special() { }<br><br>[/tmp]> cc a.c -c -o a.macho.o<br>[/tmp]> ld -r a.macho.o -o a.macho.r.o<br>[/tmp]> ld -r a.macho.o -keep_private_externs -o a.macho.r.k.o<br>[/tmp]> nm -nm a.macho.* | grep -v .eh<br><br>a.macho.o:<br>0000000000000000 (__TEXT,__text) external _glob<br>0000000000000010 (__TEXT,__text) private external _hidden_glob<br>0000000000000020 (__TEXT,__text) external l_special<br>0000000000000030 (__TEXT,__text) private external l_hidden_special<br>0000000000000040 (__TEXT,__textcoal_nt) weak external _weak_glob<br>0000000000000050 (__TEXT,__textcoal_nt) weak private external _weak_hidden_glob<br>0000000000000060 (__TEXT,__textcoal_nt) weak external l_weak_special<br>0000000000000070 (__TEXT,__textcoal_nt) weak private external l_weak_hidden_special<br><br>a.macho.r.k.o:<br>0000000000000000 (__TEXT,__text) external _glob<br>0000000000000010 (__TEXT,__text) private external _hidden_glob<br>0000000000000020 (__TEXT,__text) private external l_special<br>0000000000000030 (__TEXT,__text) private external l_hidden_special<br>0000000000000040 (__TEXT,__textcoal_nt) weak external _weak_glob<br>0000000000000050 (__TEXT,__textcoal_nt) weak private external _weak_hidden_glob<br>0000000000000060 (__TEXT,__textcoal_nt) weak private external l_weak_special<br>0000000000000070 (__TEXT,__textcoal_nt) weak private external l_weak_hidden_special<br><br>a.macho.r.o:<br>0000000000000000 (__TEXT,__text) external _glob<br>0000000000000010 (__TEXT,__text) non-external (was a private external) _hidden_glob<br>0000000000000020 (__TEXT,__text) non-external (was a private external) l_special<br>0000000000000030 (__TEXT,__text) non-external (was a private external) l_hidden_special<br>0000000000000040 (__TEXT,__textcoal_nt) weak external _weak_glob<br>0000000000000050 (__TEXT,__textcoal_nt) non-external (was a private external) _weak_hidden_glob<br>0000000000000060 (__TEXT,__textcoal_nt) non-external (was a private external) l_weak_special<br>0000000000000070 (__TEXT,__textcoal_nt) non-external (was a private external) l_weak_hidden_special<br><br>[/tmp]> cc a.c -c -flto -o a.bitcode.o<br>[/tmp]> xcrun ld -r a.bitcode.o -o a.bitcode.r.o<br>[/tmp]> nm -nm a.bitcode.*<br><br>a.bitcode.o:<br>---------------- (LTO,CODE) external _glob<br>---------------- (LTO,CODE) private external _hidden_glob<br>---------------- (LTO,CODE) weak external _weak_glob<br>---------------- (LTO,CODE) weak private external _weak_hidden_glob<br>---------------- (LTO,CODE) private external l_hidden_special<br>---------------- (LTO,CODE) external l_special<br>---------------- (LTO,CODE) weak private external l_weak_hidden_special<br>---------------- (LTO,CODE) weak external l_weak_special<br><br>a.bitcode.r.o:<br>---------------- (LTO,CODE) external _glob<br>---------------- (LTO,CODE) private external _hidden_glob<br>---------------- (LTO,CODE) weak external _weak_glob<br>---------------- (LTO,CODE) private external _weak_hidden_glob      ### <— notice weak is missing<br>---------------- (LTO,CODE) private external l_hidden_special<br>---------------- (LTO,CODE) external l_special<br>---------------- (LTO,CODE) private external l_weak_hidden_special </font><span style="font-family: Monaco; font-size: x-small;"> ### <— notice weak is missing</span><font face="Monaco" size="1"><br>---------------- (LTO,CODE) weak external l_weak_special<br>[/tmp]> </font></div><div><br></div></body></html>