c/c++语言开发共享如何在程序中获取_GLOBAL_OFFSET_TABLE_地址?

我想在我的程序中获取_GLOBAL_OFFSET_TABLE_的地址。 一种方法是在Linux中使用nm命令,可能将输出重定向到文件并解析该文件以获取_GLOBAL_OFFSET_TABLE_的地址。 但是,这种方法似乎效率很低。 有哪些更有效的方法呢?

    这似乎有效:

    #include  extern void *_GLOBAL_OFFSET_TABLE_; int main() { printf("_GLOBAL_OFFSET_TABLE = %pn", &_GLOBAL_OFFSET_TABLE_); return 0; } 

    它给:

     $ ./test _GLOBAL_OFFSET_TABLE = 0x6006d0 

    然而, nm认为不同:

     $ nm test | fgrep GLOBAL 0000000000600868 d _GLOBAL_OFFSET_TABLE_ 

    如果使用汇编语言,则可以在不使用get_pc_thunk情况下获取_GLOBAL_OFFSET_TABLE_地址。
    这很棘手。 ?

    以下是示例代码:

     $ cat test.s .global main main: lea HEREIS, %eax # Now %eax holds address of _GLOBAL_OFFSET_TABLE_ .section .got HEREIS: $ gcc -o test test.s 

    这是可用的,因为.got部分与<.got.plt>相邻
    因此,符号HEREIS_GLOBAL_OFFSET_TABLE_位于相同的地址。

    PS。 你可以检查它是否适用于objdump。

     Disassembly of section .got: 080495e8 : 80495e8: 00 00 add %al,(%eax) ... Disassembly of section .got.plt: 080495ec <_global_offset_table_>: 80495ec: 00 95 04 08 00 00 add %dl,0x804(%ebp) 80495f2: 00 00 add %al,(%eax) 80495f4: 00 00 add %al,(%eax) 

      以上就是c/c++开发分享如何在程序中获取_GLOBAL_OFFSET_TABLE_地址?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562359.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐