Как сделать статический двоичный файл из coreutils?
Я пытаюсь сделать статический двоичный файл из rm, поэтому я попытался скомпилировать coreutils с
configure; make SHARED=0 CC='gcc -static'; make install
но я продолжаю сталкиваться с ошибками.
Сначала подайте жалобу на c99 или gnu99, я решил это, добавив -std=gnu99 к значению CC:
make SHARED=0 CC='gcc -static -std=gnu99'
После этого он говорит:
/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
Я попытался добавить -fPIC, как я добавил опцию -std, но безрезультатно.
Можно ли даже сделать статические двоичные файлы из coreutils? (интересует только rm) Если да, то как? (У меня 0 опыта сборки двоичных файлов Linux)
PS: Я загрузил исходный код coreutils с сайта ubuntu, trusty.(Coreutils-8.21)
2 ответа
Согласно этому комментарию об ошибке # 640734, есть обходной путь, который вы можете попробовать:
$ cd /usr/lib/gcc/x86_64-linux-gnu/4.8
$ sudo cp crtbeginT.o crtbeginT.orig.o
$ sudo cp crtbeginS.o crtbeginT.o
Кроме того, добавить -fPIC
к команде выше:
make SHARED=0 CFLAGS='-static -std=gnu99 -static-libgcc -static-libstdc++ -fPIC'
Как только вы закончите с компиляцией, просто восстановите исходный файл следующим образом:
$ cd /usr/lib/gcc/x86_64-linux-gnu/4.8
$ sudo cp crtbeginT.orig.o crtbeginT.o
$ sudo rm crtbeginT.orig.o
Вы можете получить предварительно скомпилированную версию с помощью static-get
static-get -x coreutils