精细控制 GCC 的输出

Posted

技术标签:

【中文标题】精细控制 GCC 的输出【英文标题】:Finely Control the output of GCC 【发布时间】:2011-05-13 16:07:00 【问题描述】:

出于某些原因,我希望能够微调为我的 C++ 程序生成的最终可执行文件——细化到单个指令。我记得,GCC 应该生成一些文本汇编器文件作为中间输出,然后再将其提供给汇编器以生成最终的二进制目标文件。

我是否可以提取此汇编器源代码,以编程方式对其进行编辑并将此修改后的版本提供给最终汇编器以生成我的自定义目标文件?我的目标是 Windows 平台。

MSVC++ 是否支持类似功能?

如果您想知道为什么,部分原因是通过包含我们的自定义多态代码生成逻辑来防止逆向工程。另一个原因是在分发给客户的每个副本中创建隐藏标识,以阻止任何人破解我们的保护并分发他的破解版本。

【问题讨论】:

你为什么不直接用汇编写代码?! 你总是可以反汇编你的代码(使用像 IDA 或 Win32DAsm 这样的反汇编程序)并重新组装它,但我真的不明白这样做的意义。想详细说明您的目的吗?也许还有其他的、不那么西西弗式的方法来做你想做的事…… 您的代码有价值的机会几乎为零。我不是在侮辱,我的意思是所有代码或多或少都具有零货币价值。而且我不清楚你是否理解“多态”的含义。 复制保护也是浪费时间。你听起来像是回到了 1980 年代。 @JavaMan 我还没有投票给你。但是您建议的做法是浪费时间和精力。专注于为您的产品增加价值,而不是想方设法阻止人们使用它。 【参考方案1】:

看看-S标志:

g++ -S file.c -o output.s

然后在output.s 上进行微调并编译最终的可执行文件:

g++ output.s -o application

【讨论】:

我不知道 MSVC++ 是否支持这种东西,但是有一个 GCC 端口到 Windows,叫做 MinGW,你可以用它来完成这个。见:mingw.org【参考方案2】:

是的。在 Linux 上,试试这个:

$ cat hello.cc
#include <iostream>

int main() 
  std::cout << "Hello, world\n";


$ g++ -S hello.cc && sed -i 's/Hello, world/Goodbye, world/' hello.s && g++ -o goodbye hello.s && ./goodbye

【讨论】:

【参考方案3】:

是的,gcc 可以在编译阶段通过gcc -S 生成汇编程序中间输出。您可以使用各种优化级别-On 其中n=0,1,2,3 生成不同的汇编器输出。如果你这样做,你会注意到 -O3 产生的东西在你的脑海中不会直接映射到 C 代码,因为 gcc 已经以最佳方式实现了代码。

MSVC 可以通过cl.exe /Fafilename.asm 做同样的事情。这方面的 msdn 文档是 here。

请注意,如果您想要类似的语法,您可能希望在 gcc 端使用 gcc -masm=intel -S。另请注意,Microsoft 的 Macro 汇编器输出和 GNU AS 的输出之间会有一些差异。我不熟悉 MASM,但所有汇编程序之间存在细微差别(以及明显的 AT&T 与 Intel 语法)。

【讨论】:

以上是关于精细控制 GCC 的输出的主要内容,如果未能解决你的问题,请参考以下文章

模块清晰化 控制精细化

latex 表格如何精细控制行高,行距,行与行之

Subversion之路----利用 svnserve.exe 实现精细的目录访问控制(v1.0)

Subversion之路----利用 svnserve.exe 实现精细的目录访问控制(v1.0)

Subversion之路----利用 svnserve.exe 实现精细的目录访问控制(v1.0)

AWS 使用tag进行精细权限控制