如何制作coreutils的静态二进制文件?

Nic*_*rts 5 gcc binary make coreutils

我正在尝试制作 rm 的静态二进制文件,因此我尝试使用以下命令编译 coreutils

configure; make SHARED=0 CC='gcc -static'; make install
Run Code Online (Sandbox Code Playgroud)

但我一直遇到错误。

首先 make 抱怨 c99 或 gnu99,我通过将 -std=gnu99 添加到 CC 值来解决这个问题:

make SHARED=0 CC='gcc -static -std=gnu99'
Run Code Online (Sandbox Code Playgroud)

之后它说:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginT.o: relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginT.o: error adding symbols: Bad value
Run Code Online (Sandbox Code Playgroud)

我尝试添加 -fPIC 就像添加 -std 选项一样,但无济于事。

甚至可以制作 coreutils 的静态二进制文件吗?(只对 rm 感兴趣)如果是这样,如何?(我有 0 次构建 linux 二进制文件的经验)

PS:我从ubuntu站点下载了coreutils源码,trusty.(coreutils-8.21)

Syl*_*eau 7

根据对错误 # 640734 的评论,您可以尝试一种解决方法:

$ cd /usr/lib/gcc/x86_64-linux-gnu/4.8
$ sudo cp crtbeginT.o crtbeginT.orig.o
$ sudo cp crtbeginS.o crtbeginT.o
Run Code Online (Sandbox Code Playgroud)

另外,添加-fPIC到上面的命令:

make SHARED=0 CFLAGS='-static -std=gnu99 -static-libgcc -static-libstdc++ -fPIC'
Run Code Online (Sandbox Code Playgroud)

完成编译后,只需像这样恢复原始文件:

$ cd /usr/lib/gcc/x86_64-linux-gnu/4.8
$ sudo cp crtbeginT.orig.o crtbeginT.o
$ sudo rm crtbeginT.orig.o
Run Code Online (Sandbox Code Playgroud)