mvmvmv1234 at yahoo.com
2008-Nov-18 12:16 UTC
[dtrace-discuss] Getting error ld: fatal: symbol `__SUNW_dof'' is multiply-defined:
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
mvmvmv1234 at yahoo.com
2008-Nov-18 13:03 UTC
[dtrace-discuss] Getting error ld: fatal: symbol `__SUNW_dof'' is multiply-defined:
Please Ignore I linked .a''s instead of individual .os, somehow it worked. CC -G -o libD.so -mt -norunpath -L. -la -lb --- On Tue, 11/18/08, mvmvmv1234 at yahoo.com <mvmvmv1234 at yahoo.com> wrote:> From: mvmvmv1234 at yahoo.com <mvmvmv1234 at yahoo.com> > Subject: [dtrace-discuss] Getting error ld: fatal: symbol `__SUNW_dof'' is multiply-defined: > To: dtrace-discuss at opensolaris.org > Date: Tuesday, November 18, 2008, 12:16 PM > 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 at opensolaris.org