<html><head><meta http-equiv="Content-Type" content="text/html charset=gb2312"><meta http-equiv="Content-Type" content="text/html charset=gb2312"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><font face="Menlo" class="">I tried to use Gambit-C with the 'multiple-vms¡¯ option enabled, to harness full cpu power by SMP. But ¡®compile-file¡¯ on REPL failed with the message:</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><div class=""><font face="Menlo" class="">ld: illegal thread local variable reference to regular symbol ____tls_ptr for architecture x86_64</font></div><div class=""><font face="Menlo" class="">clang: error: linker command failed with exit code 1 (use -v to see invocation)</font></div></div><div class=""><font face="Menlo" class=""><br class=""></font></div><font face="Menlo" class="">After some experiments, it seems that the OS X linker does not properly support dynamic linking of externally defined TLS variables. This can be verified easily with the following code.</font><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">// test.c</font></div><div class=""><font face="Menlo" class="">extern __thread int tls_id;</font></div><div class=""><font face="Menlo" class="">int get_tls_id()</font></div><div class=""><font face="Menlo" class="">{</font></div><div class=""><font face="Menlo" class="">    return tls_id;</font></div><div class=""><font face="Menlo" class="">}</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">On OS X, both gcc and clang failed to produce a dynamically loadable object file.</font></div><div class=""><font face="Menlo" class="">(OS X 10.10.1, Xcode 6.2, clang-600.0.57; gcc-4.8 intalled from homebrew.)</font></div><div class=""><font face="Menlo" class="">$ gcc-4.8 -shared test.c -o libfoo.so</font></div><div class=""><span style="font-family: Menlo;" class="">$ gcc-4.9 -shared test.c -o libfoo.so</span></div><div class=""><font face="Menlo" class="">$ clang -bundle test.c -o libfoo.so</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">The three give the same error:</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><font face="Menlo" class="">Undefined symbols for architecture x86_64:<br class="">  "_tls_num", referenced from:<br class="">      _get_tls_num in test-9d6352.o<br class="">     (maybe you meant: _get_tls_num)<br class=""></font><div class=""><div class=""><font face="Menlo" class="">ld: symbol(s) not found for architecture x86_64</font></div></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">While on Linux (ArchLinux 3.18.6 X86_64, gcc 4.9.2), it worked. The produced library linked fine with main.c (as follows), execution gives 1.</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">// main.c</font></div><div class=""><font face="Menlo" class="">#include <stdio.h></font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">__thread int tls_id;</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">extern int get_tls_id();</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">int main ()</font></div><div class=""><font face="Menlo" class="">{</font></div><div class=""><font face="Menlo" class="">    int id = 0;</font></div><div class=""><font face="Menlo" class="">    tls_id = 1;</font></div><div class=""><font face="Menlo" class="">    id = get_tls_id();</font></div><div class=""><font face="Menlo" class="">    printf(¡°tls id is %d\n¡±, id);</font></div><div class=""><font face="Menlo" class="">    return 0;</font></div><div class=""><font face="Menlo" class="">}</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">I also tried to fallback on the pthread_get/setspecific() approach, by manually change CONF_THREAD_LOCAL_STORAGE_CLASS  in configure/configure.ac. Well, gsc/gsi crashes on running, due to a memory related bug. I am fairly new to Gambit, hope someone more familiar with its source would help to pin this bug.</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">If configures as enable-multiple-threaded-vm, then it crashes in alloc_scmobj_still():</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><div class=""><font face="Menlo" class="">(lldb) target create "gsc"</font></div><div class=""><font face="Menlo" class="">Current executable set to 'gsc' (x86_64).</font></div><div class=""><font face="Menlo" class="">(lldb) r</font></div><div class=""><font face="Menlo" class="">Process 96941 launched: '/Users/whimse/Work/MobileGames/Rabbit/gambit/gsc/gsc' (x86_64)</font></div><div class=""><font face="Menlo" class="">Process 96941 stopped</font></div><div class=""><font face="Menlo" class="">* thread #1: tid = 0x6176f, 0x0000000100014399 gsc`alloc_scmobj_still(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 105 at mem.c:1209, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x198)</font></div><div class=""><font face="Menlo" class="">    frame #0: 0x0000000100014399 gsc`alloc_scmobj_still(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 105 at mem.c:1209</font></div><div class=""><font face="Menlo" class="">   1206    * Account for words allocated only for non-permanent objects.</font></div><div class=""><font face="Menlo" class="">   1207    */</font></div><div class=""><font face="Menlo" class="">   1208</font></div><div class=""><font face="Menlo" class="">-> 1209   words_nonmovable += words;</font></div><div class=""><font face="Menlo" class="">   1210</font></div><div class=""><font face="Menlo" class="">   1211   if (WORDS_OCCUPIED > heap_size</font></div><div class=""><font face="Menlo" class="">   1212 #ifdef CALL_GC_FREQUENTLY</font></div></div><div class=""><div class=""><font face="Menlo" class="">(lldb) bt</font></div><div class=""><font face="Menlo" class="">* thread #1: tid = 0x66281, 0x0000000100014399 gsc`alloc_scmobj_still(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 105 at mem.c:1209, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x198)</font></div><div class=""><font face="Menlo" class="">  * frame #0: 0x0000000100014399 gsc`alloc_scmobj_still(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 105 at mem.c:1209</font></div><div class=""><font face="Menlo" class="">    frame #1: 0x0000000100014246 gsc`___alloc_scmobj(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 70 at mem.c:1284</font></div><div class=""><font face="Menlo" class="">    frame #2: 0x0000000100024686 gsc`___POINTER_to_SCMOBJ(___ps=0x00007fff7678a300, x=0x0000000102800000, tags=-2, release_fn=0x000000010003a200, obj=0x00007fff5fbff200, arg_num=127) + 86 at c_intf.c:5152</font></div><div class=""><font face="Menlo" class="">    frame #3: 0x000000010002478f gsc`___NONNULLPOINTER_to_SCMOBJ(___ps=0x00007fff7678a300, x=0x0000000102800000, tags=-2, release_fn=0x000000010003a200, obj=0x00007fff5fbff200, arg_num=127) + 111 at c_intf.c:5194</font></div><div class=""><font face="Menlo" class="">    frame #4: 0x000000010003c8ed gsc`___os_device_stream_open_predefined(index=-4, flags=64) + 365 at os_io.c:8032</font></div><div class=""><font face="Menlo" class="">    frame #5: 0x0000000100082517 gsc`___H__20___kernel_23_36(___ps=0x0000000100e6f640) + 391 at _kernel.c:17902</font></div><div class=""><font face="Menlo" class="">    frame #6: 0x0000000100010346 gsc`trampoline(___ps=0x0000000100e6f640) + 38 at setup.c:1939</font></div><div class=""><font face="Menlo" class="">    frame #7: 0x0000000100010298 gsc`___call(___ps=0x0000000100e6f640, nargs=0, proc=4305759265, stack_marker=4331667505) + 552 at setup.c:2029</font></div><div class=""><font face="Menlo" class="">    frame #8: 0x000000010001087a gsc`___setup_pstate(___ps=0x0000000100e6f640, ___vms=0x0000000100e6f640) + 330 at setup.c:2406</font></div><div class=""><font face="Menlo" class="">    frame #9: 0x0000000100010966 gsc`___setup_vmstate(___vms=0x0000000100e6f640) + 38 at setup.c:2439</font></div><div class=""><font face="Menlo" class="">    frame #10: 0x0000000100010b04 gsc`___setup(setup_params=0x00007fff5fbff6a8) + 404 at setup.c:3380</font></div><div class=""><font face="Menlo" class="">    frame #11: 0x000000010000eaa6 gsc`___main(linker=0x000000010000d4e0) + 5478 at main.c:715</font></div><div class=""><font face="Menlo" class="">    frame #12: 0x00000001000299e6 gsc`___main_char(argc=1, argv=0x00007fff5fbff8a8, linker=0x000000010000d4e0, script_line=0x0000000000000000) + 150 at os_base.c:413</font></div><div class=""><font face="Menlo" class="">    frame #13: 0x000000010000d533 gsc`main(argc=1, argv=0x00007fff5fbff8a8) + 51 at _gsc_.c:14993</font></div><div class=""><font face="Menlo" class="">    frame #14: 0x00007fff912225c9 libdyld.dylib`start + 1</font></div><div class=""><font face="Menlo" class="">    frame #15: 0x00007fff912225c9 libdyld.dylib`start + 1</font></div></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">If configures as single-threaded-vms, then it crashes in next_msection():</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><div class=""><font face="Menlo" class="">(lldb) target create "gsc"</font></div><div class=""><font face="Menlo" class="">Current executable set to 'gsc' (x86_64).</font></div><div class=""><font face="Menlo" class="">(lldb) r</font></div><div class=""><font face="Menlo" class="">Process 2727 launched: '/Users/whimse/Work/MobileGames/Rabbit/gambit/gsc/gsc' (x86_64)</font></div><div class=""><font face="Menlo" class="">Process 2727 stopped</font></div><div class=""><font face="Menlo" class="">* thread #1: tid = 0x630ab, 0x000000010001c16f gsc`next_msection(___ps=0x00007fff7678a300, ms=0x0000000000000000) + 47 at mem.c:1788, stop reason = EXC_BAD_ACCESS (code=1, address=0x8)</font></div><div class=""><font face="Menlo" class="">    frame #0: 0x000000010001c16f gsc`next_msection(___ps=0x00007fff7678a300, ms=0x0000000000000000) + 47 at mem.c:1788</font></div><div class=""><font face="Menlo" class="">   1785   ___msection *result;</font></div><div class=""><font face="Menlo" class="">   1786</font></div><div class=""><font face="Menlo" class="">   1787   if (nb_msections_used == 0)</font></div><div class=""><font face="Menlo" class="">-> 1788     result = the_msections->head;</font></div><div class=""><font face="Menlo" class="">   1789   else</font></div><div class=""><font face="Menlo" class="">   1790     result = alloc_msection->next;</font></div><div class=""><font face="Menlo" class="">   1791</font></div></div><div class=""><div class=""><font face="Menlo" class="">(lldb) bt</font></div><div class=""><font face="Menlo" class="">* thread #1: tid = 0x630ab, 0x000000010001c16f gsc`next_msection(___ps=0x00007fff7678a300, ms=0x0000000000000000) + 47 at mem.c:1788, stop reason = EXC_BAD_ACCESS (code=1, address=0x8)</font></div><div class=""><font face="Menlo" class="">  * frame #0: 0x000000010001c16f gsc`next_msection(___ps=0x00007fff7678a300, ms=0x0000000000000000) + 47 at mem.c:1788</font></div><div class=""><font face="Menlo" class="">    frame #1: 0x0000000100015d21 gsc`next_heap_msection(___ps=0x00007fff7678a300) + 129 at mem.c:1834</font></div><div class=""><font face="Menlo" class="">    frame #2: 0x000000010001778b gsc`___garbage_collect(___ps=0x00007fff7678a300, nonmovable_words_needed=9) + 443 at mem.c:4584</font></div><div class=""><font face="Menlo" class="">    frame #3: 0x0000000100013dd7 gsc`alloc_scmobj_still(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 263 at mem.c:1221</font></div><div class=""><font face="Menlo" class="">    frame #4: 0x0000000100013be6 gsc`___alloc_scmobj(___ps=0x00007fff7678a300, subtype=18, bytes=24) + 70 at mem.c:1284</font></div><div class=""><font face="Menlo" class="">    frame #5: 0x0000000100023b66 gsc`___POINTER_to_SCMOBJ(___ps=0x00007fff7678a300, x=0x0000000102800000, tags=-2, release_fn=0x00000001000396e0, obj=0x00007fff5fbff200, arg_num=127) + 86 at c_intf.c:5152</font></div><div class=""><font face="Menlo" class="">    frame #6: 0x0000000100023c6f gsc`___NONNULLPOINTER_to_SCMOBJ(___ps=0x00007fff7678a300, x=0x0000000102800000, tags=-2, release_fn=0x00000001000396e0, obj=0x00007fff5fbff200, arg_num=127) + 111 at c_intf.c:5194</font></div><div class=""><font face="Menlo" class="">    frame #7: 0x000000010003bdcd gsc`___os_device_stream_open_predefined(index=-4, flags=64) + 365 at os_io.c:8032</font></div><div class=""><font face="Menlo" class="">    frame #8: 0x0000000100080d07 gsc`___H__20___kernel_23_36(___ps=0x0000000100e4c640) + 391 at _kernel.c:17902</font></div><div class=""><font face="Menlo" class="">    frame #9: 0x000000010000fd16 gsc`trampoline(___ps=0x0000000100e4c640) + 38 at setup.c:1939</font></div><div class=""><font face="Menlo" class="">    frame #10: 0x000000010000fc68 gsc`___call(___ps=0x0000000100e4c640, nargs=0, proc=4305615905, stack_marker=4331667505) + 552 at setup.c:2029</font></div><div class=""><font face="Menlo" class="">    frame #11: 0x000000010001024a gsc`___setup_pstate(___ps=0x0000000100e4c640, ___vms=0x0000000100e4c640) + 330 at setup.c:2406</font></div><div class=""><font face="Menlo" class="">    frame #12: 0x0000000100010336 gsc`___setup_vmstate(___vms=0x0000000100e4c640) + 38 at setup.c:2439</font></div><div class=""><font face="Menlo" class="">    frame #13: 0x00000001000104d4 gsc`___setup(setup_params=0x00007fff5fbff6a8) + 404 at setup.c:3380</font></div><div class=""><font face="Menlo" class="">    frame #14: 0x000000010000e476 gsc`___main(linker=0x000000010000ceb0) + 5478 at main.c:715</font></div><div class=""><font face="Menlo" class="">    frame #15: 0x0000000100028ec6 gsc`___main_char(argc=1, argv=0x00007fff5fbff8a8, linker=0x000000010000ceb0, script_line=0x0000000000000000) + 150 at os_base.c:413</font></div><div class=""><font face="Menlo" class="">    frame #16: 0x000000010000cf03 gsc`main(argc=1, argv=0x00007fff5fbff8a8) + 51 at _gsc_.c:14993</font></div><div class=""><font face="Menlo" class="">    frame #17: 0x00007fff912225c9 libdyld.dylib`start + 1</font></div><div class=""><font face="Menlo" class="">    frame #18: 0x00007fff912225c9 libdyld.dylib`start + 1</font></div></div><div class=""><br class=""></div></body></html>