[llvm-bugs] [Bug 45318] unexpected lld error: undefined symbol: clntudp_create

via llvm-bugs llvm-bugs at lists.llvm.org
Sat Mar 28 15:12:07 PDT 2020


https://bugs.llvm.org/show_bug.cgi?id=45318

Fangrui Song <i at maskray.me> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |i at maskray.me
         Resolution|---                         |INVALID
             Status|NEW                         |RESOLVED

--- Comment #2 from Fangrui Song <i at maskray.me> ---
You can get a reproduce file via LLD_REPRODUCE= or -Wl,--reproduce=
After deleting the first line --chroot . from response.txt, you can link it
with GNU ld. GNU ld errors as well

% aarch64-linux-gnu-ld @response.txt -y clntudp_create -y
clntudp_create at GLIBC_2.17 --no-undefined
aarch64-linux-gnu-ld: tmp/c/lld.error/libsigar.a(sigar_util.o): reference to
clntudp_create
aarch64-linux-gnu-ld: tmp/c/lld.error/sysroot/lib/libc.so.6: definition of
clntudp_create at GLIBC_2.17
aarch64-linux-gnu-ld: tmp/c/lld.error/libsigar.a(sigar_util.o): in function
`sigar_rpc_ping':
sigar_util.c:(.text+0x11cc): undefined reference to `clntudp_create'
aarch64-linux-gnu-ld: sigar_util.c:(.text+0x11dc): undefined reference to
`xdr_void'
aarch64-linux-gnu-ld: sigar_util.c:(.text+0x11ec): undefined reference to
`xdr_void'
aarch64-linux-gnu-ld: sigar_util.c:(.text+0x1238): undefined reference to
`clnttcp_create'

I agree that the 'did you mean: ' diagnostic is confusing.

% ld.lld @response.txt -y clntudp_create -y clntudp_create at GLIBC_2.17
--no-undefined
tmp/c/lld.error/libsigar.a(sigar_util.o): reference to clntudp_create
tmp/c/lld.error/sysroot/lib/libc.so.6: shared definition of
clntudp_create at GLIBC_2.17
ld.lld: error: undefined symbol: clntudp_create
>>> referenced by sigar_util.c
>>>               sigar_util.o:(sigar_rpc_ping) in archive tmp/c/lld.error/libsigar.a
>>> did you mean: clntudp_create
>>> defined in: tmp/c/lld.error/sysroot/lib/libc.so.6


The definition in libc.so.6 is actually 'clntudp_create at GLIBC_2.17'
(VERSYM_HIDDEN), not 'clntudp_create' . It cannot resolve an unversioned
reference named 'clntudp_create'. This mechanism is a bit obscure but the
intention is that the linker should reject it.

A proper fix is to annotate the source code with .symver
clntudp_create,clntudp_create at GLIBC_2.17

If you don't do that, you can drop -Wl,--no-undefined as a workaround. There is
an obscure runtime behavior making this hack work. According to Linux Standard
Base 10.7.6 Symbol Resolution:

> The object with the reference does not use versioning, while the object with the definitions does. In this instance, only the definitions with index numbers 1 and 2 will be used in the reference match, the same identified by the static linker as the base definition. In cases where the static linker was not used, such as in calls to dlopen(), a version that does not have the base definition index shall be acceptable if it is the only version for which the symbol is defined.

GLIBC_2.17 has index number 2 so glibc ld.so can resolve it at runtime.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200328/261a0eb4/attachment-0001.html>


More information about the llvm-bugs mailing list