C++ 向符号表公开goto标签
我想知道是否有可能从C/C向符号表公开函数中的goto标签++ 例如,我想使下面代码段的ret标签出现在符号表中,并且可以使用标准API(如dlsym())进行引用 提前谢谢你的帮助C++ 向符号表公开goto标签,c++,c,gcc,symbols,goto,C++,C,Gcc,Symbols,Goto,我想知道是否有可能从C/C向符号表公开函数中的goto标签++ 例如,我想使下面代码段的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; } #包括 in
#include <stdio.h>
int main () {
void *ret_p = &&ret;
printf("ret: %p\n", ret_p);
goto *ret_p;
return 1;
ret:
return 0;
}
#包括
int main(){
void*ret_p=&&ret;
printf(“ret:%p\n”,ret\u p);
后进先出;
返回1;
ret:
返回0;
}
多亏了关于使用指定标签的内联asm的评论,我可以想出一个解决问题的方法。下面的示例代码片段显示了我是如何解决这个问题的
#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;
}
我将进一步测试这个解决方案,以验证它是否会产生任何意外的副作用
谢谢
根本不可能(并且你的代码不是标准C++,而且,也不是标准C——但是你可能知道)。你可以使用内联的ASM来添加汇编程序希望指示的任何代码。(顺便说一句,&&ret是一个gcc扩展,我想,你可能想添加一个gcc标签)@KonradRudolph是的,你是对的,Konrad,计算goto不是标准的一部分。不过,我正在寻找一种适用于gcc(或clang)的解决方案。我确信编译后可以编辑符号表,并添加一个指向已知函数中偏移量的“符号”,然后读取该地址和jmp,希望寄存器和内存状态不会立即导致CPU崩溃…aaaaaaaarrgh!!!如果“goto”是邪恶的,那么这是什么??世界末日野兽的疑虑?!?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