Как скомпилировать c программу, чтобы она не зависела ни от какой библиотеки? - PullRequest
3 голосов
/ 15 августа 2011

Кажется, что даже программа hello world зависит от нескольких библиотек:

libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)

Как я могу статически связать все вещи?

Ответы [ 2 ]

8 голосов
/ 15 августа 2011

Ссылка с -static. «В системах, которые поддерживают динамическое связывание, это предотвращает связывание с общими библиотеками.»

Редактировать: Да, это увеличит размер вашего исполняемого файла. Вы можете пойти двумя путями, либо сделать то, что рекомендует Марко ван де Воорт (-nostdlib, испечь свою собственную стандартную библиотеку или найти минимальную).

Другой способ - попытаться заставить GCC удалить как можно больше.

gcc  -Wl,--gc-sections -Os -fdata-sections -ffunction-sections -ffunction-sections -static test.c -o test
strip test

Уменьшает небольшой тест с ~ 800K до ~ 700K на моей машине, поэтому сокращение не так уж и велико.

Предыдущие обсуждения SO:
Мусор из других связующих единиц
Как включить только используемые символы при статической привязке к gcc?
Использование GCC для поиска недоступных функций («мертвый код»)

Update2: если вы удовлетворены использованием только системных вызовов, вы можете использовать gcc -ffreestanding -nostartfiles -static, чтобы получить действительно маленькие исполняемые файлы.

Попробуйте этот файл (small.c):

#include <unistd.h>

void _start() {
    char msg[] = "Hello!\n";
    write(1, msg, sizeof(msg));
    _exit(0);
}

Компиляция с использованием: gcc -ffreestanding -nostartfiles -static -o small small.c && strip small. Это дает исполняемый файл ~ 5K в моей системе (в котором все еще есть несколько разделов, которые должны быть разделены). Если вы хотите пойти дальше, посмотрите это руководство.

1 голос
/ 15 августа 2011

Или используйте -nostdlib и реализуйте свои собственные библиотеки и загрузочный код.

Различные сайты "ассемблер на * nix" могут дать вам представление, как это сделать.

Если выпросто хотите, чтобы ваш двоичный файл был маленьким, начните с использования 32-битного.

...