如何打印出通过 GNU 汇编程序中的 .size 指令分配的符号
How to print out symbols assigned via the .size directive in GNU Assembler
我有以下汇编代码
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leaq .LC0(%rip), %rdi
movl , %esi
movl [=10=], %eax
call printf@PLT
我不想打印出 5,而是想打印出我当前位置和我的第一个函数(名为 func)之间的 space,我一直在尝试以下操作:
var1:
.long .-func
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leaq .LC0(%rip), %rdi
movl var1, %esi
movl [=11=], %eax
call printf@PLT
我试过了
.size var1, .-func
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leaq .LC0(%rip), %rdi
movl var1, %esi
movl [=12=], %eax
call printf@PLT
到目前为止,我尝试过的所有方法都没有奏效,我们将不胜感激。
您的尝试:
var1:
.long .-func
将创建一个对象,其值是它与func
之间的距离。据我了解你的问题,你想要 main 中的调用点和 func
之间的距离。所以像这样:
leaq .LC0(%rip), %rdi
movl $.-func, %esi
movl [=11=], %eax
call printf@PLT
如果需要,您可以在 main
中为特定指令使用标签,而不是 .
。
.size
指令与您想要的无关,尽管您可能已经在常见的地方看到了 .-symbol
习语。它的唯一目的是 debugging/disassembly 帮助,使 dladdr
正确识别地址所属的符号,以及(对于数据)使复制重定位工作。
无法访问使用 .size
指令设置的符号大小。它仅用于调试和一些涉及公共数据区域的特殊情况。要将 var1
设置为 .-func1
,您可以编写
.set var1, .-func
这应该有效。你的第二个例子也应该有效。但是不知道你期望它做什么而不是它现在正在做什么,这很难说。
我有以下汇编代码
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leaq .LC0(%rip), %rdi
movl , %esi
movl [=10=], %eax
call printf@PLT
我不想打印出 5,而是想打印出我当前位置和我的第一个函数(名为 func)之间的 space,我一直在尝试以下操作:
var1:
.long .-func
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leaq .LC0(%rip), %rdi
movl var1, %esi
movl [=11=], %eax
call printf@PLT
我试过了
.size var1, .-func
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leaq .LC0(%rip), %rdi
movl var1, %esi
movl [=12=], %eax
call printf@PLT
到目前为止,我尝试过的所有方法都没有奏效,我们将不胜感激。
您的尝试:
var1:
.long .-func
将创建一个对象,其值是它与func
之间的距离。据我了解你的问题,你想要 main 中的调用点和 func
之间的距离。所以像这样:
leaq .LC0(%rip), %rdi
movl $.-func, %esi
movl [=11=], %eax
call printf@PLT
如果需要,您可以在 main
中为特定指令使用标签,而不是 .
。
.size
指令与您想要的无关,尽管您可能已经在常见的地方看到了 .-symbol
习语。它的唯一目的是 debugging/disassembly 帮助,使 dladdr
正确识别地址所属的符号,以及(对于数据)使复制重定位工作。
无法访问使用 .size
指令设置的符号大小。它仅用于调试和一些涉及公共数据区域的特殊情况。要将 var1
设置为 .-func1
,您可以编写
.set var1, .-func
这应该有效。你的第二个例子也应该有效。但是不知道你期望它做什么而不是它现在正在做什么,这很难说。