Математическая библиотека

Пример: файл simple.c

$ cc -std=c89 simple.c -c -o simple.o
$ hexdump -C simple.o
<содержмое объектного файла в шестнадцатеричном виде>
...
$ nm simple.o        
0000000000000000 T main
                 U printf
                 U scanf
0000000000000004 C var
$ ls -l simple.*
-rw-r--r-- 1 george george   94 янв 27 21:32 simple.c
-rw-r--r-- 1 george george 3488 янв 27 21:42 simple.o

Утилита hexdump покажет нам внутренности simple.o (среди трёхкилобайтного шестнадцатеричного месива можно отыскать все четыре названия). Утилита nm — выдаст информацию о том, какие идентификаторы используются в программе, при этом те, что не определены, помечены как U (undefined). При компиляции использовался старый стандарт c89, чтобы функции назывались более наглядно.

Компоновка:

$ cc -static simple.o -o simple.static
$ nm simple.static
<множество имён, среди которых есть уже `main, printf, scanf и var>
$ ls -l simple.*                          
-rw-r--r-- 1 george george      94 янв 27 21:32 simple.c
-rw-r--r-- 1 george george    3488 янв 27 22:17 simple.o
-rwxr-xr-x 1 george george 3487080 янв 27 22:17 simple.static

Статическая компоновка добавляет в объектный файл всю исполняющую систему Си и всю отладочную информацию к ней, так что получается программа в 1000 (!) раз больше. Отладочную информацию можно удалить:

$ strip simple.o simple.static 
$ ls -l simple.*              
-rw-r--r-- 1 george george     94 янв 27 21:32 simple.c
-rw-r--r-- 1 george george    880 янв 27 22:21 simple.o
-rwxr-xr-x 1 george george 730112 янв 27 22:21 simple.static

Размер раз в 5 меньше.

Вместо статической компоновки обычно используется динамическая, при которой нужные функции в исполняемый файл не записываются, а вместо этого там лежит информация, из какой библиотеки их брать при запуске. $ cc simple.o -o simple.dynamic $ nm simple.dynamic <printf и scanf в этом варианте нет> $ ldd

Домашнее задание

  1. {i} Прочитать что-нибудь из учебника

  2. Сделать что-нибудь из задачника

  3. …или из другого задачника

  4. <!> Задание повышенной хитрости