我正在尝试编译一个不使用动态加载器的可执行文件(ELF文件)。我构建了一个交叉编译器,将来自Linux的MIPS编译为我所制作的模拟器所用。在编译我的hello.cpp文件(hello world程序)时,我使用了-static-libgcc标志进行断言。然而,显然这还不够。因为我的可执行文件中仍然有一个段包含动态加载器的名称/路径。我需要使用哪些标志来生成包含运行所需一切的可执行文件?我需要重建我的交叉编译器吗?
我正在尝试编译一个不使用动态加载器的可执行文件(ELF文件)。我构建了一个交叉编译器,将来自Linux的MIPS编译为我所制作的模拟器所用。在编译我的hello.cpp文件(hello world程序)时,我使用了-static-libgcc标志进行断言。然而,显然这还不够。因为我的可执行文件中仍然有一个段包含动态加载器的名称/路径。我需要使用哪些标志来生成包含运行所需一切的可执行文件?我需要重建我的交叉编译器吗?
-static -static-libgcc -static-libstdc++
使用这三个标志针对所有依赖项的静态版本进行链接(假设使用gcc)。请注意,在某些情况下,您不一定需要全部三个标志,但它们也不会“伤害”您。因此,请打开所有三个标志。
确保确实没有动态链接
ldd yourexecutable
应该返回“not a dynamic executable”或等效内容。
确保没有未解决的符号
nm yourexecutable | grep " U "
列表应为空或仅包含一些特殊的内核空间符号,例如U __tls_get_addr
最后,请检查您是否可以执行可执行文件
-static
标志?