Обычно, чтобы использовать динамическую библиотечную функцию c, вам нужно будет связать ее с указанной библиотекой во время компиляции с помощью переключателя -l
, как, например, gcc -lm prog.c
при использовании функций c mathemati (из *). 1003 *).
Однако, поскольку это так часто встречается, G CC всегда связывает стандартную библиотеку C по умолчанию, что означает, что выполнение gcc prog.c
на самом деле аналогично выполнению gcc -lc prog.c
. Это всегда делается независимо от того, включен ли заголовок или нет.
Второе, что делает эту работу, это то, что G CC предполагает, что любая функция, которая не была объявлена во время компиляции, имеет подпись int func(void)
, В этом случае подпись очень похожа на сигнатуру действительной функции getpid()
.
Если вы посмотрите на скомпилированную программу с помощью инструмента ldd
, чтобы показать, какие библиотеки динамического c являются обязательно, вы увидите, что программа связана с libc
:
$ ldd prog
linux-vdso.so.1 (0x00007ffede7d0000)
==> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0f47018000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0f475b9000)
Когда ваша программа запускается, она запрашивает загрузчик dynamici c где (по какому адресу) найти getpid
функция перед вызовом его в первый раз. Загрузчики dynamici c проверяют загруженные библиотеки и находят функцию с таким именем в libc
, так что все , кажется, работает без проблем.
Вы можете сказать G CC не ссылаться на стандартную библиотеку по умолчанию, используя переключатель компилятора -nostdlib
, но это не так полезно в вашем случае Реальное решение - всегда обрабатывать предупреждения о неявных объявлениях функций как ошибки (-Werror=implicit-function-declaration
).
Если ваш компилятор не выдает это предупреждение по умолчанию, я бы предложил вам обновить его до более новой версии. G CC 4 определенно не последняя версия, доступная для Ubuntu 18.
$ sudo apt update
$ sudo apt upgrade