gpt4 book ai didi

使用 ld 创建非 PIC 共享库

转载 作者:行者123 更新时间:2023-12-01 04:43:18 25 4
gpt4 key购买 nike

我有一堆没有 -fPIC 编译的目标文件选项。所以对函数的调用不使用 @PLT . (源代码是 C,用 clang 编译)。

我想将这些目标文件链接到一个共享库中,我可以使用 dlopen 在运行时加载该库。 .我需要这样做,因为在实际 .so 之前我必须做很多设置已加载。

但每次我尝试与 -shared 链接时选项,我收到错误 -

relocation R_X86_64_PC32 against symbol splay_tree_lookup can not be used when making a shared object; recompile with -fPIC



我从源代码重新编译没有问题。但我不想用 -fPIC .这是我们正在研究自定义编译器的研究项目的一部分。 PIC 不适用于我们试图在编译器中提供的保证类型。

是否有一些标志可以用于 ld以便它生成加载时间重定位库。事实上,我没有搬迁也没关系。我可以提供库的基地址和 dlopen如果虚拟地址不可用,则可能会失败。

我用于编译 c 的命令文件相当于 -
clang -m64 -c foo.c

并用于链接我正在使用
clang -m64 -shared *.o -o foo.so

我说等价是因为它是一个自定义编译器( fork 了 clang )并且有一些额外的步骤。但它是等价的。

最佳答案

不可能动态加载现有的非 PIC 对象并期望它正常工作。

如果您无法重新编译原始代码以创建支持 PIC 的正确共享库,那么我建议您创建一个服务可执行文件,该服务可执行文件链接到由这些对象组成的静态库。然后,服务可执行文件可以提供 IPC/RPC/REST API/共享内存/任何东西,以允许您的程序使用您的目标代码。

然后,您可以编写一个使用 PIC 编译的共享库,该库提供包装器 API,用于启动服务可执行文件并与之通信以执行实际工作。

进一步思考,这个包装 API 库也可能是静态的。它的动态方面是通过启动服务可执行文件来执行的。

关于使用 ld 创建非 PIC 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48901388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com