Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Linux-инструменты для Windows-программистов
Назад Компиляция и сборка приложений Вперед

Компилятор GCC

Программа:

#include <stdio.h>
int main( int argc, char *argv[] ) {
   printf("Hello, world!\n" );
};

Примечание: единственно понадобившийся мне #include здесь : <stdio.h>, без него:

$ gcc hello_world.c
hello_world.c: In function ‘main’:
hello_world.c:4: предупреждение: incompatible implicit declaration of built-in function ‘printf’

Вот как мы делаем компиляцию-сборку такой простейшей программы:

$ gcc hello_world.c
$ ls -l
-rwxrwxr-x 1 olej olej 4735 Мар 19 15:44 a.out
-rw-rw-rw- 1 olej olej   94 Мар 19 15:48 hello_world.c

$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux
2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

$ g++ hello_world.c

$ ls -l
-rwxrwxr-x 1 olej olej 5180 Мар 19 15:49 a.out
-rw-rw-rw- 1 olej olej   94 Мар 19 15:48 hello_world.c

У GCC великое множество опций (знаменитая книга Артура Гриффитса «GCC: Complete Reference» имеет 624 стр.), ниже перечислены только ежедневно используемые...

Компилятор распознаёт язык программирования исходного кода, применённый в файле, по расширению файла, например: *.c — C, *.cc — C++, *.S — ассемблер в AT&T нотации (не Intel!). Но язык кода можно определить и ключом -x <язык>. В одной команде GCC в качестве входных файлов могут смешиваться файлы разных форматных представлений (исходные С, исходные ассемблерные, объектные):

$ gcc f1.c f2.S f3.o —o resfile

GCC может произвести только частичную обработку, произведя результат в зависимости от ключа:

-c — только компилировать в объектный формат (не вызывать компоновщик):

$ gcc fin.c -c —o fout.o

-S — компилировать в ассемблерный код:

$ gcc fin.c -S —o fout.S

-E — только выполнить препроцессорную обработку и разрешить макросы:

$ gcc fin.c -E —o fout.c

Справочная информация по GCC:

$ gcc --version
gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)

$ gcc --help
Синтаксис: gcc [ключи] файл...
...

$ man gcc
GCC(1)                               GNU                               GCC(1)
NAME
       gcc - GNU project C and C++ compiler
...

- текст man очень объёмный и может в меру долго загружаться.

Запуск и исполнение приложений:

$ gcc hello_world.c -o hello_world

$ ./hello_world
Hello, world!

$ hello_world
bash: hello_world: команда не найдена

$ strace ./hello_world
execve("./hello_world", ["./hello_world"], [/* 54 vars */]) = 0
brk(0)                                 = 0x9b8a000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=114110, ...}) = 0
mmap2(NULL, 114110, PROT_READ, MAP_PRIVATE, 4, 0) = 0xb7fa5000
close(4)                               = 0
open("/lib/libc.so.6", O_RDONLY)        = 4
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\277\266\0004\0\0\0"..., 512) = 512
...
write(1, "Hello, world!\n", 14Hello, world!)         = 14
exit_group(14)                          = ?

$ ltrace ./hello_world
__libc_start_main(0x8048384, 1, 0xbf8e7724, 0x80483c0, 0x80483b0 <unfinished ...>
puts("Hello, world!"Hello, world!
)                                                    = 14
+++ exited (status 14) +++

Предыдущий раздел: Оглавление Следующий раздел:
Компиляция и сборка приложений   Библиотеки