我想知道是否可以将函数中的 goto 标签暴露给 C/C++ 的符号表
例如,我想让以下代码段的ret标签出现在符号表中,并且可以使用标准 API(如 dlsym())进行引用。
提前感谢您的帮助!
#include <stdio.h>
int main () {
void *ret_p = &&ret;
printf("ret: %p\n", ret_p);
goto *ret_p;
return 1;
ret:
return 0;
}
感谢Marc Glisse关于使用指定标签的内联汇编的评论,我可以为这个问题想出一个解决方法。以下示例代码片段显示了我是如何解决问题的。
#include <stdio.h>
int main () {
void *ret_p = &&ret;
printf("ret: %p\n", ret_p);
goto *ret_p;
return 1;
ret:
asm("RET:")
return 0;
}
这将添加一个符号表条目,如下所示。
jikk@sos15-32:~$ gcc -Wl,--export-dynamic t.c -ldl
jikk@sos15-32:~$ readelf -s a.out
39: 08048620 0 FUNC LOCAL DEFAULT 13 __do_global_ctors_aux
40: 00000000 0 FILE LOCAL DEFAULT ABS t.c
41: 0804858a 0 NOTYPE LOCAL DEFAULT 13 RET
42: 08048612 0 FUNC LOCAL DEFAULT 13 __i686.get_pc_thunk.bx
43: 08049f20 0 OBJECT LOCAL DEFAULT 19 __DTOR_END__
jikk@sos15-32:~$ ./a.out
ret: 0x804858a
我将进一步测试此解决方法,以验证这是否会产生任何意外的副作用。
谢谢