编译独立的静态可执行文件

发布于 2024-09-10 08:26:28 字数 216 浏览 7 评论 0原文

我正在尝试编译一个不使用动态加载器的可执行文件(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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鸠书 2024-09-17 08:26:28

使用以下标志进行链接

-static -static-libgcc -static-libstdc++

使用这三个标志来链接所有依赖项的静态版本(假设是 gcc)。请注意,在某些情况下,您不一定需要所有三个标志,但它们也不会“造成伤害”。因此,只需打开所有三个即可。

检查它是否确实有效

  1. 确保确实没有动态链接

    ldd 你的可执行文件
    

    应该返回“不是动态可执行文件”或类似的内容。

  2. 确保没有未解析的符号

    nm 你的可执行文件 |查找“U”
    

    列表应该为空或者应该只包含一些特殊的内核空间符号,例如

    <前><代码>U __tls_get_addr

  3. 最后,检查您是否可以实际执行可执行文件

Use the following flags for linking

-static -static-libgcc -static-libstdc++

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

  1. Make sure that there is really no dynamic linkage

    ldd yourexecutable
    

    should return "not a dynamic executable" or something equivalent.

  2. Make sure that there are no unresolved symbols left

    nm yourexecutable | grep " U "
    

    The list should be empty or should contain only some special kernel-space symbols like

    U __tls_get_addr
    
  3. Finally, check if you can actually execute your executable

怪我鬧 2024-09-17 08:26:28

尝试使用 -static 标志?

Try using the -static flag?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文