如何打印出通过 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

这应该有效。你的第二个例子也应该有效。但是不知道你期望它做什么而不是它现在正在做什么,这很难说。