“仍然报告”;未定义符号:新增;“使用后”;objcopy——重新定义sym add=new“u ad”;

“仍然报告”;未定义符号:新增;“使用后”;objcopy——重新定义sym add=new“u ad”;,c,linux,objcopy,C,Linux,Objcopy,我需要加载两个动态库,其中有一个函数名冲突。因此,我使用命令“objcopy--redefinite sym add=new\u add libmy\u test.So libmy\u test\u new.So”来修改符号名 但它仍然报告“错误:./libmy\u test\u new.so:未定义符号:new\u add” 以下是我的测试代码 void *lib_handle2 = dlopen("./libmy_test_new.so", RTLD_NOW); if (NULL == li

我需要加载两个动态库,其中有一个函数名冲突。因此,我使用命令“objcopy--redefinite sym add=new\u add libmy\u test.So libmy\u test\u new.So”来修改符号名

但它仍然报告“错误:./libmy\u test\u new.so:未定义符号:new\u 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;
}
因此,它似乎不适用于动态符号。原文中有更多的解释。如果要同时使用这两个符号,则需要以某种方式重新链接其中一个库。但是,如果您只需要其中一个符号,则链接顺序可能会对您有所帮助

也许解决方案是创建一个包装器库,在其中DLS打开两个LIB,创建两个新符号,并使用具有正确句柄的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");

当然,它不能解决在库中生成调用的问题。

顺便说一句,我使用objdump检查libmy_test_new.so在更改了符号名之后。结果还可以。objdump--syms libmy_test_new.so | grep new_add 000004e8 g F.text 00000011 new_add谢谢你的回答。但是有没有其他方法来解决我的问题呢。我的目的是同时加载两个库。谢谢。实际上,我尝试了在两个库中让两个pinter访问相同函数的方法。但第二个dlsym始终返回第一个dlsym返回的指针,而不是指向第二个库中函数的实际指针。所以我想可能是因为相同的符号已经存在于过程空间中。所以我想更改动态库的符号名来解析它。现在我知道我可以使用编译标志“-fPIC”来解析它。