3

関数内の goto ラベルを C/C++ のシンボル テーブルに公開できるかどうかを知りたい

例えば、次のスニペットのretラベルをシンボルテーブルから出現させ、dlsym() などの標準 API を使用して参照できるようにしたいと考えています。

事前にご協力いただきありがとうございます。

#include <stdio.h>

int main () {
  void *ret_p = &&ret;
  printf("ret: %p\n", ret_p);
  goto *ret_p;

  return 1;

  ret:
  return 0;
}
4

1 に答える 1

3

ラベルを指定するインライン asm の使用に関する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

この回避策をさらにテストして、予期しない副作用が発生するかどうかを確認します。

ありがとう

于 2013-01-13T20:57:29.080 に答える