<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/88082>88082</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLD] wrap not changing symbol reliably
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jdomke
</td>
</tr>
</table>
<pre>
We have an "old" library which is build against a previous libm version (around gcc8 / RHEL 8 timeframe) and requires symbol __sqrtl_finite, and I don't have access to the sources (so recompiling it is not an option):
```
$ nm libfj90f.so | grep __sqrtl_finite
U __sqrtl_finite
```
Unfortunately, a newer libm (from a gcc 12 toolchain) has only a versioned version of it
```
$ nm libm.so.6 | grep __sqrtl_finite
000000000001f740 T __sqrtl_finite@GLIBC_2.17
```
My solution (not sure if good or bad or broken; since not an expert) was to create a intermediate library to map the un-versioned to a versioned call:
```
$ cat mfix.c
__asm__(".symver __real___sqrtl_finite,__sqrtl_finite@GLIBC_2.17");
extern long double __real___sqrtl_finite(long double x);
long double __wrap___sqrtl_finite(long double x) { return __real___sqrtl_finite(x); }
```
and compile it with:
```
clang -fPIC ./mfix.c -shared -o libm_fix.so -lm
$ nm libm_fix.so | grep __sqrtl_finite
U __sqrtl_finite@GLIBC_2.17
00000000000005b8 T __wrap___sqrtl_finite
```
Then I can link, using the --wrap flag, with `ld` (fyi: -fuse-ld=bfd seems to work as well):
```
$ echo 'int main(){return 0;}' >a.c
$ clang a.c -lfj90f -Wl,-wrap=__sqrtl_finite -lm_fix -lm
```
However, when I try the same with `lld` then i still see undefined references:
```
$ clang a.c -lfj90f -Wl,-wrap=__sqrtl_finite -lm_fix -lm -fuse-ld=lld
ld.lld: error: undefined reference due to --no-allow-shlib-undefined: __sqrtl_finite
>>> referenced by ./libfj90f.so
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
The llvm repo we are using is actually from https://github.com/flang-compiler/classic-flang-llvm-project but the lld state in it should be equivalent to commit f906fd5.
Furthermore, for sake of brevity, i was obmitting a few details above, but here is the full linker line if someone really needs it:
```
End of search list.
"/home/u10016/project_SPRT/llvm-v17.0.2/compute_node/bin/ld.lld" --sysroot=/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc -pie -EL --hash-style=gnu --eh-frame-hdr -m aarch64linux -dynamic-linker /lib/ld-linux-aarch64.so.1 -o a.out /vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/usr/lib/../lib64/Scrt1.o /vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/usr/lib/../lib64/crti.o /vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../lib/gcc/aarch64-none-linux-gnu/12.3.1/crtbeginS.o -L/home/u10016/project_SPRT/llvm-v17.0.2/compute_node/bin/../lib -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/lib64 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/usr/lib64 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../lib/aarch64-none-linux-gnu -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/lib/clang/17/lib/aarch64-none-linux-gnu -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../lib/gcc/aarch64-none-linux-gnu/12.3.1 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../lib/gcc/aarch64-none-linux-gnu/12.3.1/../../../../aarch64-none-linux-gnu/lib/../lib64 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../lib/gcc/aarch64-none-linux-gnu/12.3.1/../../../../lib64 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/lib/../lib64 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../../lib -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/usr/lib/../lib64 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../lib/gcc/aarch64-none-linux-gnu/12.3.1/../../../../aarch64-none-linux-gnu/lib -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/lib -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/usr/lib -dynamic-linker=/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/lib/ld-linux-aarch64.so.1 -rpath=/home/u10016/project_SPRT/llvm-v17.0.2/compute_node/bin/../lib:/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/lib64:/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/usr/lib64 -rpath-link=/home/u10016/project_SPRT/llvm-v17.0.2/compute_node/bin/../lib:/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/lib64:/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/crosstools/aarch64-none-linux-gnu/libc/usr/lib64 /opt/FJSVxtclanga/tcsds-1.2.39/lib64/fjlang08.o /opt/FJSVxtclanga/tcsds-1.2.39/lib64/fjomp.o /opt/FJSVxtclanga/tcsds-1.2.39/lib64/fjhpctag.o -lfjomphk -lfjomp -lfjompcrt -lpthread -lfj90i -lfj90fmt_sve -lfj90f -wrap=__sqrtl_finite -lm_fix -lfjsrcinfo -lfjcrt -lm -lrt -latomic -lelf -lz -ldl /local/a-fd136a.o -liomp5 -L/vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/lib -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed /vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/../../lib/gcc/aarch64-none-linux-gnu/12.3.1/crtendS.o /vol0005/mdt3/data/ra000020/u10016/llvm-v17.0.2/compute_node/bin/../crosstools/aarch64-none-linux-gnu/libc/usr/lib/../lib64/crtn.o
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWd9v2zgS_muYlwEFmXb848EPTV3d9pADFtvu7aNBkSOLDUV6ScqO768_DGU3Tpuk217a5g5nGLYsk8NvPn4zHFIyRrNxiEt2ecUuVxeyT60Pyw_adzd4UXt9WP6B0ModgnTAhPBWMyHAmjrIcIB9a1QLJkLdG6tBbqRxMYGEbcCd8X2klh3sMETjycBcBt87DRul5sBEBb_98uYa5pBMh02QHTKxAOk0BPyzNwEjxENXewvrdfwzJLtujDMJmXidW70F7R0Ts3TEqBTGCMlDahGi74PCSKNGDwGV77bGGrcBkwiz84m88ttkyMiCjV-xcsXKV2xaHt_DTzEB15EnzYdF2RTRA5u9hk3A7aewcnv4_cHbn1j93TU-pN7JhPaQ_QGHewwDY0zMm-A7kMQUjAQk761qpSGg0MoI3tkDyBO1qD-S7Bsw6QuOdEX0xfRpN8q716iZTUp4_2mzSfm367dXr9eiGM0eHjB__uMA0ds-HRVAtMc-IJgGNt5r8AFqOXwFf4OOja8gGqfwNEN4u8WQyPG9zLOrAsqEIMG4hKFDbejnSZTJQye3WQK943cEJX-PLyWtfWrKlUzQNea2UMO99VrGbr1mYs6EKOKh22GA9TqgtOvP1PkUU0JksV0NZvE2YXBgvduA9n1t8TGj8_M2t-c27nfeB7n9cmdgsysImPrgHh3wOAiw2epBmigEh6hCiqm9Se1jjCor3QZ48-vb11AwUQ3MAo-tDKiB-yzLNd2NHrjtPpPs6b-vjL3PRVqevy7reRb2Q6Q9Lun3LTp4C0o6sMbdUPj2kTILiY5zMgaNlRv6g1gBNi2tZtMScmQfDBu_At70EbnVbLyqGw0Rscvq3vtwAzLCHq39QlpC1XpgYmZcgi4nhzn1mF0dJ7YkicxWTMyAjd_Ik5SzvPOESJoDm_Ma8D8sE68zeDZe3eeCZoQm4GxmHuLlF7_HHYbs9kBRooCkZCw7vKNi4CJREwMxGWvJfeidxsZQcAZsMKBTGJ8M0W_24Zx8QjOEkS7oevwKMAQf6OIBRKB7pGni3HkurfV7Hltrav6xLXV8UErjN8P7zpiG-pDj4Wx1OQuYe1hIaRgo4DoKvEYai3rgFG9NAuU1wogE1kcEviOQxKpxO6_kaZF7UtRg7a6DgFsPewQZ8ChrE0Gq1EtrD5DXpTalbZ4aUTFRbUxq-7pQvmOiagg4P6aFwESlLJUZig9_0Ah8G_wHVAnqPmV1WKshJkrixlEmia3vrYYagcqAnbToUk78vutMgmZRTht9WQy4qz6kFkPnQ64LGh8gyhukhbCmMiTl5dXkxcPXnUmJXJLQ4B40JmlsBFn7Xe5NiFqk1SlmZE1v7Yl5a1xetaLv0DsESpr2AA5RR1pzH1HqG6cJS0QZVAvWxHQEDnkpqFpPZU_Vj8pyNGWiOpKzfvfrb-9JGUTYbjQryoJaE7F9wrXzmnrVFPTVUblCAOfxEIP3iY1XTFQ7bynJUcLVacxEpWWSTFRBUvIT5fm4f2WggrSqgo-RCpLIRCXJq-mEO--QW-P6W75x_aBoBXxrEPiba-C8lbHlMR0ssvFq43rgHFueiz7e6gC8g6OtbAW4PjjZGcWP7A8ms7PHcY7NqZYZ0QoiC98n-Plek_kYPuItjvE9nTBRvVMhjQr_wlGqkMxLAZl7nNBRslHqqV4jUYyL0eBDjRvj3hUe-PXzxNkJxmDw-bj5KkLyJP1UBB918_w47vP8KJbnHnYYa1hzRUVF-g8d_ofGxn81-Hv97j6eGutecvtfdP5FOfbyCf9eSfx5V-GXgu5HRelL8fcFQfkojE9r4eeu7b8hwB8pwsNWpnaA94zl1rDR_Jnl1k9FcK_cygxnHfyf5u9HMxOV3yYmqurv7_55m3JhSBCSijryUSGK8eJsv9R8oAblfNgzfV1P322_pVu7VUluaG9js4325nR1-lYhAbfb1AaU-nhCZk4nZV1axx3enZt96cSs-RCDMq4ZxhtMd8BtvpDJd0YBt2gb4PZfwK22ecPulbREPW_0aDyVGa7x3fbyOxTwwO1GKeBcRu4QNerhzjoez-rObt-xov56txexKPwH22F0-t1L2dU_dfTgCv_JQdqFXo71YryQF7gczUZiOh6N5qOLdrkop7N6KmQzmV1Oy0sp67lalHpeTqZT1GJ-YZaiFJNyUi5KcTkuy0JOa1nOywk2uJiOdMMmJXbS2IL8LHzYXJgYe1zO5-VcXFhZo4358agQwxEbu1xdhGVmpe43kU1Ka2KKd_2TSTY_Ub2-XrHLFeSnAc4nUK10G-M2p2eaAa2RtT1c9MEunzhRJcuniTimdyaqDJOozkj_HQAA__-b1zmB">