【问题标题】:make GCC's ASM label available for tokenization使 GCC 的 ASM 标签可用于标记化
【发布时间】:2014-08-04 09:11:58
【问题描述】:

所以,让我警告你们,我不太了解 GCC 的构建过程如何使用预处理器。特别是为汇编程序和链接器命名的汇编符号。

但是,根据我在编译器创建抽象语法树后收集到的信息,汇编器第二次调用预处理器来创建符号标签以找出所有静态依赖关系等等......

现在,这可能听起来很奇怪,但我需要访问 ASM 标签并在代码中使用它们,并使用相同的预处理器对它们进行字符串化 (#str),具体来说。我可以使用 asm 手动进行标记。但我需要访问构建内部定义的那些

当然,从使用 GCC 编译的程序员的角度来看,预处理器只在一开始就被调用一次,以创建一个非常非常长的源文件。 asm 标签是在之后发生的。那么至少有可能在 GCC 中通过这本书来做到这一点吗?

【问题讨论】:

  • 好的,我到底为什么要这样做?我想实现一种重新定义其他宏的“宏内”方式。所以我一直在玩:_Pragma("redefine_extname X val")
  • 问题是它只对装配标签执行此操作。所以我想如果在编译器将代码转换为抽象语法树之前预处理器可能会这样做,那么我可能能够标准地访问符号名称,至少在 GCC 下。
  • 我知道,这是个愚蠢的主意。

标签: c++ c gcc assembly build


【解决方案1】:

gcc -c foo.c 将为您提供 obj 文件。使用 objdum -S foo.o 查看 asm 代码。

例如:

$gcc -c foo.c
$objdump -S foo.o

foo.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <test>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 10             sub    $0x10,%rsp
   8:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
   c:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  10:   8b 10                   mov    (%rax),%edx
  12:   b8 00 00 00 00          mov    $0x0,%eax
  17:   89 d6                   mov    %edx,%esi
  19:   48 89 c7                mov    %rax,%rdi
  1c:   b8 00 00 00 00          mov    $0x0,%eax
  21:   e8 00 00 00 00          callq  26 <test+0x26>
  26:   c9                      leaveq
  27:   c3                      retq

【讨论】:

    猜你喜欢
    • 2013-10-18
    • 2022-09-30
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多