使用GCC编译原始汇编代码注入代码

使用GCC编译原始汇编代码注入代码,c,gcc,assembly,compiler-optimization,powerpc,C,Gcc,Assembly,Compiler Optimization,Powerpc,我想将一些C或C++代码直接编译到PowerPC程序集,而不需要任何生成的辅助函数、标准库、ELF头等等。这是类似的,但我仍然有一些麻烦 假设我想将以下代码直接编译到原始程序集,只生成一个函数并内联所有内容: auto get_address() { const auto value = *(int *) 0x1234; // Read the value from address 0x1234 return reinterpret_cast<int *>(value

我想将一些
C
C++
代码直接编译到
PowerPC
程序集,而不需要任何生成的辅助函数、标准库、
ELF
头等等。这是类似的,但我仍然有一些麻烦

假设我想将以下代码直接编译到原始程序集,只生成一个函数并内联所有内容:

auto get_address() {
    const auto value = *(int *) 0x1234; // Read the value from address 0x1234
    return reinterpret_cast<int *>(value); // Return it as address
}

void perform_write() {
    const auto address = get_address(); // Get the address using the helper function
    *address = 1; // Assign a value to the address
}
现在,如果我使用编译器资源管理器网站:

这有以下问题:

  • 尽管辅助函数
    get\u address()
    内联在
    perform\u write()
    中,但它还是会生成。如何获取
    GCC
    以从输出中省略冗余的
    get_address()
    ?我能否以某种方式将
    perform_write()
    标记为入口点以完成此任务?我尝试使用属性
    \uuuu attribute\uuuuu((始终\u内联))
    但它什么也没做(可能是因为默认情况下,
    GCC
    已经内联了代码,但没有删除未使用的函数)
  • 不重要:替换
    %
    符号会很好,即使这对于进一步编译机器代码并不重要。
    Intel
    复选框被禁用,
    %
    通常是
    AT&T
    语法

  • 我希望最好使用编译器标志或在必要时修改源代码来完成这些事情。我希望避免使用编程语言对输出进行后处理,以获得所需的输出,因为这当然有效,但可能不够健壮。

    1。标记您的
    get\u地址
    函数
    静态
    。2.英特尔vs at&t仅适用于x86。您当然可以使用
    -mno regnames
    ,但由于您明确添加了
    -mregnames
    ,我想您不希望这样。如果您不标记函数
    static
    ,则它具有全局范围。编译器必须生成它,因为其他单元可能会调用它。@Jester:是的,这就成功了,谢谢:)1。标记您的
    get\u地址
    函数
    静态
    。2.英特尔vs at&t仅适用于x86。您当然可以使用
    -mno regnames
    ,但由于您明确添加了
    -mregnames
    ,我想您不希望这样。如果您不标记函数
    static
    ,则它具有全局范围。编译器必须生成它,因为其他单元可能会调用它。@Jester:是的,这就成功了,谢谢:)
    li r9,4660
    li r10,1
    lwz r9,0(r9)
    stw r10,0(r9)
    blr