[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