相关疑难解决方法(0)

GAS:.cfi_def_cfa_offset的说明

我想解释一下GCC生成的汇编中.cfi_def_cfa_offset指令使用的值.我隐约知道.cfi指令涉及调用帧和堆栈展开,但我想更详细地解释为什么,例如,在编译以下C程序时GCC输出的汇编中使用值16和8的原因在我的64位Ubuntu机器上.

C程序:

#include <stdio.h>

int main(int argc, char** argv)
{
        printf("%d", 0);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在源文件test.c上调用了GCC,如下所示:gcc -S -O3 test.c.我知道-O3可以实现非标准优化,但为了简洁起见,我想限制生成的程序集的大小.

生成的程序集:

        .file   "test.c"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "%d"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
.LFB22:
        .cfi_startproc
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        xorl    %edx, %edx
        movl    $.LC0, %esi
        movl    $1, %edi
        xorl    %eax, %eax
        call    __printf_chk
        xorl    %eax, %eax
        addq    $8, %rsp
        .cfi_def_cfa_offset 8
        ret
            .cfi_endproc
.LFE22:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
        .section        .note.GNU-stack,"",@progbits …
Run Code Online (Sandbox Code Playgroud)

assembly callstack gnu-assembler dwarf

50
推荐指数
1
解决办法
2万
查看次数

链接静态库时,避免链接未使用的符号

我正在使用apple gcc编译一个我要重新分发的dylib.出于各种原因,我正在使用一些库,让我们说libz保持简单.

由于此库通常不在Mac系统上找到,因此我希望通过将路径传递到简化部署来将已使用符号中的静态链接到dylib中.a-file.

现在,链接器将lib 中的所有符号链接到生成的dylib中,尽管我只引用了一个子集.在linux上我从未遇到过这个问题,链接器很高兴丢弃所有未引用的符号并创建一个非常纤薄的可执行文件,所以它应该是可能的.我现在拥有的dylib文件比它应该大10倍.

我已尝试使用-dead_code链接器标记,但无济于事.也许我只是不明白吗?

有谁知道这个解决方案?

c++ linker darwin

3
推荐指数
1
解决办法
5872
查看次数

标签 统计

assembly ×1

c++ ×1

callstack ×1

darwin ×1

dwarf ×1

gnu-assembler ×1

linker ×1