But I need help. When build with clang there are undefined references,
and I'm not able to find out why this is. I listed the things I did
find out in this review. But I suspect it is either my unfamiliarty with
C++, the mozilla buildsystem or some kind of wierd clang vs gcc thing.
I found this problem when I was trying to port lang/gjs to version 1.50.1.
This version requires spidermonkey52 but I was getting the undefined
references problem. This problem first showed up on my test system which
is running HEAD, but I also reproduced it on 10.3-i386 with clang.
./.libs/libgjs.so: undefined reference to `void JS::TraceEdge<JSObject*>(JSTracer*, JS::Heap<JSObject*>*, char const*)'
./.libs/libgjs.so: undefined reference to `void js::UnsafeTraceManuallyBarrieredEdge<JSObject*>(JSTracer*, JSObject**, char const*)'
./.libs/libgjs.so: undefined reference to `void js::UnsafeTraceManuallyBarrieredEdge<JS::Value>(JSTracer*, JS::Value*, char const*)'
./.libs/libgjs.so: undefined reference to `void js::UnsafeTraceManuallyBarrieredEdge<jsid>(JSTracer*, jsid*, char const*)'
After some looking around I decided to build spidermonkey52 with both clang
and gcc6, and looked at the symbols in libmozjs-52.so.
nm -DgC /usr/local/lib/libmozjs-52.so.1 > ${compiler}-symbols.txt
lang/spidermonkey52 % cat gcc-symbols.txt | grep JS::TraceEdge
0000000000650ecc T JS::TraceEdge(JSTracer*, JS::TenuredHeap<JSObject*>*, char const*)
000000000065e082 W void JS::TraceEdge<jsid>(JSTracer*, JS::Heap<jsid>*, char const*)
0000000000662961 W void JS::TraceEdge<JS::Value>(JSTracer*, JS::Heap<JS::Value>*, char const*)
000000000065c123 W void JS::TraceEdge<JSFunction*>(JSTracer*, JS::Heap<JSFunction*>*, char const*)
000000000065ccc2 W void JS::TraceEdge<JSAtom*>(JSTracer*, JS::Heap<JSAtom*>*, char const*)
000000000065c146 W void JS::TraceEdge<JSObject*>(JSTracer*, JS::Heap<JSObject*>*, char const*)
000000000065ea67 W void JS::TraceEdge<JSScript*>(JSTracer*, JS::Heap<JSScript*>*, char const*)
000000000065cce5 W void JS::TraceEdge<JSString*>(JSTracer*, JS::Heap<JSString*>*, char const*)
000000000065ddcf W void JS::TraceEdge<JS::Symbol*>(JSTracer*, JS::Heap<JS::Symbol*>*, char const*)
clang:
0000000000740770 T JS::TraceEdge(JSTracer*, JS::TenuredHeap<JSObject*>*, char const*)
00000000007519d0 W void JS::TraceEdge<jsid>(JSTracer*, JS::Heap<jsid>*, char const*)
0000000000751870 W void JS::TraceEdge<JS::Value>(JSTracer*, JS::Heap<JS::Value>*, char const*)
0000000000751530 W void JS::TraceEdge<JSFunction*>(JSTracer*, JS::Heap<JSFunction*>*, char const*)
00000000007513e0 W void JS::TraceEdge<JSAtom*>(JSTracer*, JS::Heap<JSAtom*>*, char const*)
0000000000751590 W void JS::TraceEdge<JSScript*>(JSTracer*, JS::Heap<JSScript*>*, char const*)
0000000000751720 W void JS::TraceEdge<JSString*>(JSTracer*, JS::Heap<JSString*>*, char const*)
0000000000751290 W void JS::TraceEdge<JS::Symbol*>(JSTracer*, JS::Heap<JS::Symbol*>*, char const*)
Ok so only the JS::TraceEdge<JSObject*>() function is missing. Now the
other symbol.
lang/spidermonkey52 % cat gcc-symbols.txt | grep js::UnsafeTraceManuallyBarrieredEdge
000000000065e0a8 W void js::UnsafeTraceManuallyBarrieredEdge<jsid>(JSTracer*, jsid*, char const*)
0000000000662991 W void js::UnsafeTraceManuallyBarrieredEdge<JS::Value>(JSTracer*, JS::Value*, char const*)
000000000065c138 W void js::UnsafeTraceManuallyBarrieredEdge<JSFunction*>(JSTracer*, JSFunction, char const*)
000000000065ccd7 W void js::UnsafeTraceManuallyBarrieredEdge<JSAtom*>(JSTracer*, JSAtom, char const*)
000000000065c15b W void js::UnsafeTraceManuallyBarrieredEdge<JSObject*>(JSTracer*, JSObject, char const*)
000000000065ea7c W void js::UnsafeTraceManuallyBarrieredEdge<JSScript*>(JSTracer*, JSScript, char const*)
000000000065ccfa W void js::UnsafeTraceManuallyBarrieredEdge<JSString*>(JSTracer*, JSString, char const*)
000000000065dde4 W void js::UnsafeTraceManuallyBarrieredEdge<JS::Symbol*>(JSTracer*, JS::Symbol, char const*)
lang/spidermonkey52 % cat clang-symbols.txt | grep js::UnsafeTraceManuallyBarrieredEdge
0000000000751370 W void js::UnsafeTraceManuallyBarrieredEdge<JS::Symbol*>(JSTracer*, JS::Symbol**, char const*)
This function is even missing more stuff.
I think we can presume there are more "missing symbols" but these are the
only onces I focused on due to gjs.