【发布时间】:2017-08-02 12:51:35
【问题描述】:
我在下面测试过这么简单的程序
/* a shared library */
dispatch_write_hello(void)
{
fprintf(stderr, "hello\n");
}
extern void
print_hello(void)
{
dispatch_write_hello();
}
我的主程序是这样的:
extern void
dispatch_write_hello(void)
{
fprintf(stderr, "overridden\n");
}
int
main(int argc, char **argv)
{
print_hello();
return 0;
}
程序的结果是“覆盖”。
为了弄清楚为什么会发生这种情况,我使用了 gdb。调用链是这样的:_dl_runtime_resolve -> _dl_fixup ->_dl_lookup_symbol_x
我发现glibc中_dl_lookup_symbol_x的定义是
在加载对象的符号表中搜索符号 UNDEF_NAME 的定义,可能带有请求的符号版本
所以我认为在尝试查找符号dispatch_write_hello 时,它首先在主目标文件中查找,然后在共享库中查找。这就是这个问题的原因。我的理解对吗?非常感谢您的宝贵时间。
【问题讨论】:
标签: c gcc function-interposition library-interposition