编译独立的静态可执行文件
我正在尝试编译一个不使用动态加载器的可执行文件(ELF 文件)。我构建了一个交叉编译器,可以从 Linux 编译 mips,以便在我制作的模拟器上使用。我在编译 hello.cpp 文件(hello world 程序)时断言了标志 -static-libgcc。显然这还不够。因为我的可执行文件中仍然有一个段包含动态加载程序的名称/路径。我使用什么标志来生成包含运行所需的所有内容的可执行文件?我需要重建交叉编译器吗?
I'm trying to compile an executable (ELF file) that does not use a dynamic loader. I built a cross compiler that compiles mips from linux to be used on a simulator I made. I asserted the flag -static-libgcc on compilation of my hello.cpp file (hello world program). Apparently this is not enough though. Because there is still a segment in my executable which contains the name/path of the dynamic loader. What flags do I use to generate an executable which contains EVERYTHING needed to be run? Do I need to rebuild my cross compiler?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用以下标志进行链接
使用这三个标志来链接所有依赖项的静态版本(假设是 gcc)。请注意,在某些情况下,您不一定需要所有三个标志,但它们也不会“造成伤害”。因此,只需打开所有三个即可。
检查它是否确实有效
确保确实没有动态链接
应该返回“不是动态可执行文件”或类似的内容。
确保没有未解析的符号
列表应该为空或者应该只包含一些特殊的内核空间符号,例如
<前><代码>U __tls_get_addr
最后,检查您是否可以实际执行可执行文件
Use the following flags for linking
Use these three flags to link against the static versions of all dependencies (assuming gcc). Note, that in certain situation you don't necessarily need all three flags, but they don't "hurt" either. Therefore just turn on all three.
Check if it actually worked
Make sure that there is really no dynamic linkage
should return "not a dynamic executable" or something equivalent.
Make sure that there are no unresolved symbols left
The list should be empty or should contain only some special kernel-space symbols like
Finally, check if you can actually execute your executable
尝试使用
-static
标志?Try using the
-static
flag?