[Bug libitm/55693] [4.8 Regression] libitm.c++/eh-1.C execution test fails on darwin from r193271

howarth at nitro dot med.uc.edu gcc-bugzilla@gcc.gnu.org
Wed Jan 23 19:42:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55693

--- Comment #31 from Jack Howarth <howarth at nitro dot med.uc.edu> 2013-01-23 19:41:52 UTC ---
I believe the attached testcase, weak_symbol.tar.bz2, demonstrates that the
solution on darwin is to mark the duplicate symbols in crttme.o as weak.
Consider the following test case...

% cat fun.c
extern void foo(void) __attribute__((weak));
 void fun(void)
 {
   if (foo) foo();
 }

% cat foo.c
#include <stdio.h>

void foo(void)
{
  printf("Hello!\n");
}


% cat bar.c
#include <stdio.h>

void foo(void) __attribute__((weak));

void foo(void)
{
  printf("Goodbye!\n");
}

% cat weak_test.c
#include <stdio.h>

void fun(void);

int main()
{
  fun();
  return 0;
}

compiled as...

clang -c fun.c
clang -dyanmiclib -shared -Wl,-undefined -Wl,dynamic_lookup -o libfun.dylib
fun.o
clang -c foo.c
clang -dyanmiclib -shared -Wl,-undefined -Wl,dynamic_lookup -o libfoo.dylib
foo.o
clang -c bar.c
clang -c weak_test.c
clang -o weak_test weak_test.o ./libfoo.dylib ./libfun.dylib bar.o
clang -o weak_test2 weak_test.o  ./libfun.dylib bar.o

This gives...

setenv DYLD_LIBRARY_PATH .
% ./weak_test
Hello!
% ./weak_test2
Goodbye!

which argues that if we mark the weak symbols from eh_cpp.cc as weak in
crttme.o as well, those symbols can be overridden by the ones in libstdc++ as
expected. Also, this eliminates the need to place libstdc++ first...

% clang -o weak_test3 weak_test.o ./libfun.dylib bar.o ./libfoo.dylib
% ./weak_test3
Hello!



More information about the Gcc-bugs mailing list