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

时间:2010-07-19 16:39:48

标签: c++ compiler-construction linker executable

我正在尝试编译不使用动态加载程序的可执行文件(ELF文件)。我构建了一个交叉编译器,它编译linux中的mips,用于我制作的模拟器上。我在编译hello.cpp文件(hello world program)时声明了标志-static-libgcc。显然这还不够。因为我的可执行文件中仍有一个段包含动态加载程序的名称/路径。我用什么标志来生成包含需要运行的所有内容的可执行文件?我需要重建我的交叉编译器吗?

2 个答案:

答案 0 :(得分:87)

使用以下标志进行链接

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

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

检查它是否真的有效

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

    ldd yourexecutable
    

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

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

    nm yourexecutable | grep " U "
    

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

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

答案 1 :(得分:20)

尝试使用-static标志?