动态链接:如何忽略版本标签?

pas*_*cal 7 linker ld

我想编译一个使用clAmdFFT,AMD的OpenCL FFT的OpenCL程序,它是闭源的.

$ objdump -x libclAmdFft.Runtime.so
Dynamic Section:
  NEEDED               libOpenCL.so.1
Version References:
  required from libOpenCL.so.1:
    0x028568b0 0x00 05 OPENCL_1.0
Run Code Online (Sandbox Code Playgroud)

在一台机器上,我正在使用AMD驱动程序,它附带一个包含版本信息的libOpenCL.so,如下所示:

a$ objdump -T /opt/AMDAPP/lib/x86_64/libOpenCL.so
0000000000002610 g    DF .text  0000000000000018  OPENCL_1.0  clGetSamplerInfo
00000000000032e0 g    DF .text  0000000000000018  OPENCL_1.1  clSetEventCallback
0000000000002350 g    DF .text  0000000000000018  OPENCL_1.2  clCreateSubDevices
Run Code Online (Sandbox Code Playgroud)

这台机器上的一切都很好.

在另一台机器上,我使用的是nVidia驱动程序,它带有一个不包含版本信息的libOpenCL.so,如下所示:

b$ objdump -T /usr/lib/libOpenCL.so # -> /usr/lib/nvidia-current/libOpenCL.so
00000000000021f0 g    DF .text  0000000000000018  Base        clGetSamplerInfo
0000000000002a40 g    DF .text  0000000000000018  Base        clSetEventCallback
Run Code Online (Sandbox Code Playgroud)

-llibOpenCL.so -llibclAmdFft.Runtime.so由于clAmdFft想要链接到带标记的符号,因此在此处链接程序失败:

libclAmdFftRuntime.so: undefinded reference to `clCreateBuffer@OPENCL_1.0`
Run Code Online (Sandbox Code Playgroud)

动态链接器也会生成此抱怨:

b$ ldd libclAmdFft.Runtime.so
libclAmdFft.Runtime.so: …/libOpenCL.so.1: no version information available …
Run Code Online (Sandbox Code Playgroud)

由于nVidia驱动程序实现OpenCL 1.1并且AmdFFT只需要1.0,因此如果我可以说服它,它应该可以工作Base = OPENCL_1.0.那可能吗?

我不能强迫nVidia用户安装另一个版本,因为libOpenCL是驱动程序的一部分,比如libGL.


链接--unresolved-symbols=ignore-in-shared-libs成功,但生成的二进制文件不再找到FFT库.


由于OpenCL的分裂出了设备相关的部分纳入ICD库,它如果我从AMD驱动程序提供的libOpenCL.so,即使在NVIDIA的机器,它动态地从/ etc/OpenCL的商/供应商/ NVIDIA加载正确的ICD工作. icd,但我不确定这是否实际上是可移植的,例如目录是硬编码的.