使用“objcopy --redefine-sym add=new_ad”后仍然报告“未定义符号:new_add”

Posted

技术标签:

【中文标题】使用“objcopy --redefine-sym add=new_ad”后仍然报告“未定义符号:new_add”【英文标题】:Still reports "undefined symbol: new_add" after use "objcopy --redefine-sym add=new_ad" 【发布时间】:2010-10-13 07:04:43 【问题描述】:

我需要加载两个动态库,其中一个函数名冲突。所以我使用命令“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;

【问题讨论】:

顺便说一句,我在更改符号名称后使用 objdump 检查了 libmy_test_new.so。结果还可以。 objdump --syms libmy_test_new.so | grep new_add 000004e8 g F .text 00000011 new_add 【参考方案1】:

根据这个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");

当然不能解决库内部产生调用的问题。

【讨论】:

感谢您的回答。但是有没有其他方法可以解决我的问题。我的目的是同时加载两个库。 谢谢。实际上,我尝试了在两个库中获得两个相同功能的方法。但是第二个 dlsym 总是返回第一个 dlsym 返回的指针,而不是指向第二个库中函数的真正指针。所以我想可能是因为进程空间中已经存在相同的符号。所以我想改变动态库的符号名称来解决它。现在我知道我可以使用编译标志“-fPIC”来解决它。

以上是关于使用“objcopy --redefine-sym add=new_ad”后仍然报告“未定义符号:new_add”的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份