I have 2 .cpp files in two different directories in which I need to put DTrace probes. They are compiled into two .a libraries one after another. In the end they are combined to a single .so file. This sequence I can not change. I get an error "ld: fatal: symbol `__SUNW_dof' is multiply-defined:". What is the solution for this?
Here is my simulation of real world problem in sample files. $gmake CC -mt -xtarget=ultra -g -xs -c -o a.o a.cpp dtrace -G -32 -s 1.d a.o -o 1.o CC -xar -o liba.a a.o 1.o CC -mt -xtarget=ultra -g -xs -c -o b.o b.cpp dtrace -G -32 -s 2.d b.o -o 2.o CC -xar -o libb.a b.o 2.o CC -G -o libc.so a.o b.o 1.o 2.o -mt -norunpath ld: fatal: symbol `__SUNW_dof' is multiply-defined: (file 1.o type=OBJT; file 2.o type=OBJT); ld: fatal: File processing errors. No output written to libc.so gmake: *** [all] Error 1 $cat Makefile all:: CC -mt -xtarget=ultra -g -xs -c -o a.o a.cpp dtrace -G -32 -s 1.d a.o -o 1.o CC -xar -o liba.a a.o 1.o CC -mt -xtarget=ultra -g -xs -c -o b.o b.cpp dtrace -G -32 -s 2.d b.o -o 2.o CC -xar -o libb.a b.o 2.o CC -G -o libc.so a.o b.o 1.o 2.o -mt -norunpath clean:: rm *.o *.a $cat 1.d provider sjsws1 { probe reached1(const char *); }; $cat 2.d provider sjsws2 { probe reached2(const char *); }; $cat a.cpp #include <stdio.h> #include "sjsws.h" main() { DTRACE_REACHED1("one"); } $cat b.cpp #include <stdio.h> #include "sjsws.h" void myfunc(void) { DTRACE_REACHED2("two"); } $cat sjsws.h #ifndef SJSWS #define SJSWS 1 #include "sys/sdt.h" #ifdef __cplusplus extern "C" { #endif #define DTRACE_REACHED1(arg0) \ __dtrace_sjsws1___reached1(arg0) #define DTRACE_REACHED2(arg0) \ __dtrace_sjsws2___reached2(arg0) extern void __dtrace_sjsws1___reached1(const char *); extern void __dtrace_sjsws2___reached2(const char *); #ifdef __cplusplus } #endif #endif _______________________________________________ dtrace-discuss mailing list dtrace-discuss@opensolaris.org