Почему в файле /proc/<pid>/maps на Linux отсутствует информация о библиотеках, которые используются в сишном коде?

Как я могу гарантировать, что при компиляции программы с использованием библиотеки pthread, адрес библиотеки будет отображен в файле /proc//maps? В текущей ситуации, при запуске процесса, я не вижу упоминания о libpthread в данном файле.
  • 2 февраля 2024 г. 11:19
Ответы на вопрос 2
Файл `/proc/<pid>/maps` содержит сведения о сегментах памяти, которые отображены в адресное пространство процесса. Он включает в себя библиотеки, выделенные области для стека, кучи, а также сегменты кода и данных.

Если вы не видите информацию о библиотеке `libpthread` или любой другой библиотеке в файле `/proc/<pid>/maps`, возможно, происходит одно из следующих:

1. Библиотека не была загружена: Ваша программа может быть скомпилирована с использованием библиотеки `pthread`, но если библиотека не используется (т.е. ваш код не вызывает функции из `libpthread`), то динамический загрузчик может не загрузить эту библиотеку в память, и она не будет отображаться в `/proc/<pid>/maps`. 

2. Оптимизация компоновщика: Некоторые системы предоставляют функции, традиционно предоставляемые `libpthread`, например, некоторые реализации стандартного Си, которые могут предоставлять потоковые функции напрямую в `libc`. Таким образом, `libpthread` может быть не нужна, и она не будет отображена в `/proc/<pid>/maps`.

3. Ошибки в отображении или ограничениях доступа к `/proc/<pid>/maps`: Возможно, что процесс запущен с определёнными ограничениями, и вы не имеете прав доступа к его карте памяти.

Чтобы гарантировать, что библиотека `libpthread` будет отображаться в `/proc/<pid>/maps`, необходимо:

- Убедиться, что ваш код действительно использует функции из `libpthread`, такие как `pthread_create` для создания потоков, что вызовет динамическую загрузку библиотеки.

- Компилировать код с флагом `-lpthread`, чтобы явно указать компилятору и компоновщику использовать библиотеку `pthread`. Например: `gcc myprogram.c -o myprogram -lpthread`.

- Проверить права доступа к файлу `/proc/<pid>/maps`. Возможно, для просмотра отображаемых библиотек в `maps` нужны привилегии суперпользователя или соответствующие права для пользователя, под которым запущен процесс.

- Если вы используете статическую компоновку (`-static` флаг при компиляции), библиотека `libpthread` будет скомпонована в исполняемый файл, и её загрузка будет интегрирована в код программы, и отдельный сегмент для `libpthread` в `/proc/<pid>/maps` может не появиться. Убедитесь, что вы не используете статическую компоновку неумышленно.

Если вы сделали все вышеуказанные шаги и библиотека всё еще не отображается в `/proc/<pid>/maps`, стоит проверить, есть ли какие-то особенности в вашей системе, которые могут влиять на загрузку и отображение библиотек.

Файл `/proc/<pid>/maps` можно посмотреть, используя команду:

```sh
cat /proc/<pid>/maps
```

или

```sh
grep libpthread /proc/<pid>/maps
```

чтобы искать конкретные строки, связанные с `lib
Компилирую gcc -o outfile source.c -lpthread. То есть собираю без всяких статиков, чтобы были зависимости к подключенным библиотекам. Далее запускаю процесс, чекаю /proc/pid/maps. Там нет ни единого упоминания к libpthread.

100500 лет назад libpthread объединилась с glibc и теперь хоть и существует отдельно, чтобы программы использующие -lpthread продолжали собираться, внутри пустая. Короче, ты выбрал неудачного кандидата для экспериментов.
Похожие вопросы