// main.c
#include <stdio.h>
int main(void)
{
printf("Hello World !\n");
return 0;
}
Для предварительной обработки, компиляции, сборки и, наконец, связывания простой вышеупомянутой программы hello world выполните следующие действия:
Шаг 1/4) Предварительная обработка main.c для генерации main.i:
$: gcc -E main.c -o main.i
Шаг 2/4) Скомпилируйте main.i для генерации main.s:
$: gcc -S main.i -o main.s
Шаг 3/4) Соберите main.s для генерации main.o:
$: as main.s -o main.o
ПРИМЕЧАНИЕ. Вы можете объединить вышеупомянутые шаги 1, 2 и 3, используя флаг -c (small C) для gcc:
$: gcc -c main.s -o main.o
Шаг 4/4) Свяжите main.o с другими необходимыми объектными файлами, а именно, crti.o & crtn.o (они определяют прологи и эпилоги функций соответственно), crt1.o (содержит символ _start для начальной загрузки начального выполнения программа), путь libc.so или флаг -lc для libc, а затем, наконец, задайте имя динамического компоновщика, чтобы сгенерировать динамически связанный исполняемый файл ELF:
На x86_64:
$: ld /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crt1.o -lc main.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main_ELF_executable
ИЛИ (если вы хотите указать путь к libc.so)
$: ld /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/libc.so main.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main_ELF_executable
На 32-битном ARM:
$: ld /usr/lib/arm-linux-gnueabihf/crti.o /usr/lib/arm-linux-gnueabihf/crtn.o /usr/lib/arm-linux-gnueabihf/crt1.o -lc main.o -dynamic-linker /lib/ld-linux.so.3 -o main_ELF_executable
ИЛИ (если вы хотите указать путь к libc.so)
$: ld /usr/lib/arm-linux-gnueabihf/crti.o /usr/lib/arm-linux-gnueabihf/crtn.o /usr/lib/arm-linux-gnueabihf/crt1.o /usr/lib/arm-linux-gnueabihf/libc.so main.o -dynamic-linker /lib/ld-linux.so.3 -o main_ELF_executable
Затем вы можете запустить исполняемый файл ELF 'main_ELF_executable':
$: ./main_ELF_executable
Hello World!
Источники:
https://linux.die.net/man/1/gcc
https://linux.die.net/man/1/ld
https://dev.gentoo.org/~vapier/crt.txt