c++ - 如何将 C++ 程序的编译逻辑与文件头数据的其余部分隔离开来?
问题描述
我想观察一个非常基本的 C++ 程序的两个版本之间编译的操作码二进制输出的差异。例如,2 + 2 = ?,没有调用任何库。我希望编译后的输出是一个带有一些小标题的二进制操作码的小文件,对于已编译的程序来说是新的,但是有很大的标题。
simple.cpp
int main()
{
unsigned int a = 2;
unsigned int b = 2;
unsigned int c = a + b;
}
编译器:
g++ -std=c++0x simple.cpp -o simple
是否有一种我可以导出的格式不包含标题,只是我们指示机器执行的操作码二进制文件?如果不是,我可以在结果文件中查找哪些字节或位置以将相关逻辑与程序隔离?
我需要机器代码,而不是汇编,因为我的项目是分析源文件的不同混淆版本,以尝试基于另一个识别一个。一个具有可疑可行性的复杂主题,但这就是为什么我要求隔离机器代码而不仅仅是程序集 - 以测试对真实机器代码输出的分析。
我尝试用谷歌搜索标题结构,但似乎找不到太多信息。
解决方案
看到ld(1): GNU linker - Linux man page,你会发现你可以使用--oformat=output-format
选项来指定输出格式。
binary
是一种没有标题的格式。
然后,查看gcc(1): GNU project C/C++ compiler - Linux man page,您会发现可以使用-Wl
option 将选项传递给链接器。
-nostdlib
选项对于避免添加额外的东西也很有用。
结合这些,你可以试试这个命令:
g++ -std=c++0x simple.cpp -nostdlib -Wl,--oformat=binary -o simple
推荐阅读
- javascript - 在刷新页面上找不到 React js/空白页面
- gradle - 如何在 gradle 复合构建中包含 3 个目录和 2 个可交付成果?
- metadata - 编辑镶木地板文件元数据
- python - 我不断收到此错误:长度不匹配:预期轴有 1 个元素,新值有 5 个元素。我如何解决它?
- shell - 负退出代码的含义
- javascript - 用于解析 URL 参数的 Javascript - 并不总是有效
- node.js - 如何在 node-oracledb 5.1 中执行存储过程时出现编译错误
- tensorflow - InvalidArgumentError:reshape 的输入是具有 2745600 个值的张量,但请求的形状需要 1152 的倍数 函数调用堆栈:t
- microsoft-graph-api - 状态代码:0 Microsoft.Graph.ServiceException:代码:tooManyRetries 消息:发送请求时遇到超过 3 次重试
- sql-server - 使用 LEFT JOIN 插入 INTO SELECT 以防止重复,仅防止表中已有重复