将 goto 标签暴露给符号表

Posted

技术标签:

【中文标题】将 goto 标签暴露给符号表【英文标题】:Exposing goto labels to symbol table 【发布时间】:2012-12-25 10:54:25 【问题描述】:

我想知道是否可以将函数内的 goto 标签暴露给 C/C++ 的符号表

例如,我想让以下sn-p的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;

【问题讨论】:

根本不可能(而且你的代码不是标准的 C++,而且,AFAIK,它也不是标准的 C——但你可能知道)。 您可以使用内联汇编来添加汇编程序期望指示符号的任何代码。 (顺便说一句,我认为 &&ret 是一个 gcc 扩展,您可能需要添加一个 gcc 标签) @KonradRudolph 是的,你是对的 Konrad,计算的 goto 不是标准的一部分。但是我正在寻找适用于 gcc(或 clang)的解决方案。 我确信可以在编译后编辑符号表并添加一个指向已知函数中偏移量的“符号”,然后读取该地址并 jmp 并希望寄存器和内存状态获胜不要立即导致 CPU 冒烟... Aaaaaaarrgh!!! 如果goto 是邪恶的,那么这是什么?末世兽的疑虑?!? 【参考方案1】:

感谢Marc Glisse 的评论是关于使用指定标签的内联汇编,我可以为这个问题想出一个解决方法。下面的示例代码 sn-p 显示了我是如何解决这个问题的。

#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

我将进一步测试此解决方法,以验证这是否会产生任何意外的副作用。

谢谢

【讨论】:

以上是关于将 goto 标签暴露给符号表的主要内容,如果未能解决你的问题,请参考以下文章

未解决符号表,导出符号表和地址重定向表

iOS符号表

符号表--01---概述与实现

MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA

将工作表另存为 PDF 时,换行符变为矩形符号

数据结构——符号表