Ссылка с -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 в моей системе (в котором все еще есть несколько разделов, которые должны быть разделены). Если вы хотите пойти дальше, посмотрите это руководство.