[mpich-devel] Weak symbols, clang, and users compiling with -fvisibility=hidden
Jed Brown
jedbrown at mcs.anl.gov
Mon Jan 6 12:14:27 CST 2014
MPICH's test for weak symbols is:
int foo(int) __attribute__((weak,alias("__foo")));
where __foo is not defined in the same compilation unit. This fails
with gcc (tested with 4.8 and 4.4):
conftest.c:37:5: error: 'foo' aliased to undefined symbol '__foo'
int foo(int) __attribute__((weak,alias("__foo")));
^
This is (evidently) a change from gcc-3.x, but is intentional because
knowledge of the weak alias is not desirable/meaningful in other
compilation units.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20652
My understanding of gcc's intent is that the attribute only be stated in
the implementation. The caller can't do anything with the information
that foo is a weak alias; it still needs to generate a PLT entry and the
loader will need to perform a relocation.
Now my problem is that clang accepts the test code above (i.e., it does
not insist that __foo be defined in the same compilation unit) which causes
#define MPICH_ATTR_WEAK_ALIAS(fname) __attribute__((weak,alias(fname)))
but this breaks PMPI and when -fvisibility=hidden is used to compile
user code, it generates (objdump -r)
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000005 R_X86_64_PC32 __foo-0x0000000000000004
instead of the linkable (but not desired because it prevents interposing
"foo")
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000005 R_X86_64_PLT32 __foo-0x0000000000000004
What we actually want is an honest relocation for "foo":
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000005 R_X86_64_PLT32 foo-0x0000000000000004
When you try to link the first version later, you get
/usr/bin/ld.gold: error: bar.o: requires dynamic R_X86_64_PC32 reloc against '__foo' which may overflow at runtime; recompile with -fPIC
which is not actually an -fPIC error, but rather a result of clang using
R_X86_64_PC32 for a symbol that we really want to be R_X86_64_PLT32. I
think this should probably be reported to Clang/LLVM (because it delays
a confusing error condition), but I also think that MPICH should fix its
usage.
So in summary, we can't have __attribute__((weak,alias("PMPI_..."))) in
the header because:
1. it does not compile with gcc
2. it breaks PMPI interposition with clang
3. it breaks -fvisibility=hidden with clang
Instead, it should go in the implementation files.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
URL: <http://lists.mpich.org/pipermail/devel/attachments/20140106/64cb11cd/attachment-0001.pgp>
More information about the devel
mailing list