【问题标题】:How to get the value of global variables imported from linker through gdb?如何通过gdb获取从链接器导入的全局变量的值?
【发布时间】:2016-06-30 09:14:22
【问题描述】:

以下全局变量被导入汇编文件。

.global _sbss               /* Start of .bss in RAM */
.global _ebss               /* End+1 of .bss in RAM */

通过 gdb,我怎样才能得到这些值? 当我尝试打印 _ebss 时,我得到以下信息:

(gdb) print _ebss
$1 = 106 'j'

我不明白上面的意思。我期待 RAM 中的地址。

【问题讨论】:

    标签: assembly linker gdb


    【解决方案1】:

    要打印符号的地址,请使用取地址运算符 (&):

    (gdb) print &_ebss
    $1 = ...
    

    否则,gdb 会打印存储在符号地址中的值。

    【讨论】:

    • (gdb) print &_ebss 给出如下: $2 = ( *) 0x4c24a0 "j\205[\307x\231j\222\027\362 \224\273T\031\274\r"
    • @sniper 0x4c24a0 不是你想要的地址吗?
    • @sniper:您可以使用 .type 指令或其他东西来发出元数据,将符号标记为 gdb 不会尝试解码的东西。不要使用void*,因为这可能更令人困惑。 (存储在那里的值不是void* 或其他任何东西,您希望将其地址视为void*。)
    • @PeterCordes 您可以将符号声明为const void 类型。这是合法的,但是会导致一些编译器崩溃。
    • @PeterCordes 这看起来像是手动编写的 DWARF 代码。我不知道如何在汇编中做到这一点。我认为在调试器中在运行时添加类型信息是最好的选择。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多