2

「大きな」問題があります。現在、Linux 上のプログラム (仮想マシン) で dtor リストのアドレスを取得しようとしています。明らかにデストラクタ関数がありますが、nm を使用し、すべてのアドレスとその名前が表示されている場合、それを見つけることができません。それに関連する唯一のものは do_global_dtors_aux です。また、コードが実行されると、期待どおりに完全に機能します。これが私のコードです:

  #include <stdlib.h>
  #include <stdio.h>

  static void cleanup(void) __attribute__ ((destructor));

  int main() {
      printf("in the main function...");
      exit(0);
  }

  void cleanup(void){
      printf("in the cleanup");
  }

そして、これが私が使用するときですnm

0000000000600808 d _DYNAMIC
00000000006009f0 d _GLOBAL_OFFSET_TABLE_
0000000000400678 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
00000000004007e0 r __FRAME_END__
0000000000600800 d __JCR_END__
0000000000600800 d __JCR_LIST__
0000000000600a38 D __TMC_END__
0000000000600a38 A __bss_start
0000000000600a28 D __data_start
0000000000400550 t __do_global_dtors_aux
00000000006007f0 t __do_global_dtors_aux_fini_array_entry
0000000000600a30 D __dso_handle
00000000006007e8 t __frame_dummy_init_array_entry
                 w __gmon_start__
00000000006007f0 t __init_array_end
00000000006007e8 t __init_array_start
00000000004005d0 T __libc_csu_fini
00000000004005e0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
0000000000600a38 A _edata
0000000000600a40 A _end
000000000040066c T _fini
0000000000400430 T _init
0000000000400490 T _start
00000000004004bc t call_gmon_start
00000000004005b4 t cleanup
0000000000600a38 b completed.6092
0000000000600a28 W data_start
00000000004004e0 t deregister_tm_clones
                 U exit@@GLIBC_2.2.5
0000000000400570 t frame_dummy
000000000040059c T main
                 U printf@@GLIBC_2.2.5
                 U puts@@GLIBC_2.2.5
0000000000400510 t register_tm_clones
4

1 に答える 1