c - 使用 "undefined symbol: new_add"后还是报 "objcopy --redefine-sym add=new_ad"

标签 c linux objcopy

我需要加载两个动态库,并且有一个函数名冲突。所以我使用命令“objcopy --redefine-sym add=new_add libmy_test.so libmy_test_new.so”来修改符号名称。

但是还是报“Error: ./libmy_test_new.so: undefined symbol: new_add”

以下是我的测试代码。

void *lib_handle2 = dlopen("./libmy_test_new.so", RTLD_NOW);
if (NULL == lib_handle2) {
    printf("Error: %s\n", dlerror());
    goto err1;
}

fp_add f_add2 = dlsym(lib_handle2, "new_add");
if (NULL == f_add2) {
    printf("Error: %s\n", dlerror());
    goto err2;
}

最佳答案

根据这个page ,它似乎不适用于动态符号。更多解释可见原文thread .如果你想同时使用这两个符号,那么你需要以某种方式重新链接其中一个库。但是,如果您只需要其中一个符号,那么链接顺序可能会对您有所帮助。

也许解决方案是创建一个包装器库,您可以在其中 dlsopen 这两个库,创建两个新符号,然后使用带有正确句柄的 dlsym 分配它们。

void *lib_handle1 = dlopen("./lib1.so", RTLD_NOW);
void *lib_handle2 = dlopen("./lib2.so", RTLD_NOW);

fp_add f_add1 = dlsym((lib_handle1, "add");
fp_add f_add2 = dlsym(lib_handle2, "add");

当然没有解决库内部产生调用的问题。

关于c - 使用 "undefined symbol: new_add"后还是报 "objcopy --redefine-sym add=new_ad",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921440/

相关文章:

c - 如何将 Swift 字符串传递给 c 函数?

python - Django 生产服务器的 Linux 用户方案

linux - 使用 vmstat 时没有通过管道写入任何内容

rust - 如何获取 objcopy 生成的二进制镜像文件中的入口点地址?

stm32 - Objcopy elf 到 bin 文件

c++ - 定义数组时是否可以接受const_cast?

c - 按位与 unsigned long 与 0xffffffff

c - printf %s 和 for loop %c 哪个更快

linux-kernel - 为什么我在运行 readelf -s 时得到这个输出

linux - EasyEngine安装过程中如何回答安装问题?