Динамическое связывание и глобальные переменные - PullRequest
0 голосов
/ 23 января 2019

Я новичок в C и связывании, просто у меня два вопроса по .so share library.

Допустим, у меня есть общая библиотека math.so, изначально созданная из add.c и multiple.c, и у меня есть программа test.c, которая использует только функцию добавления в add.c.

В1. Даже если я не использую функцию множественных функций, вся общая библиотека math.so (включая несколько кодов и данных) все равно будет загружена в память, верно ли мое понимание?

Q2- Поскольку math.so используется в памяти совместно, как нам обращаться с глобальными данными в math.so? например в add.c есть глобальная переменная number = 0, test.c изменяет ее на number = 1, а другая программа test2.c изменяет ее на number = 2, поэтому после переключения контекста test.c пытается вывести число, значение которого равно 2, не совсем то значение (которое должно быть 1), которое должно быть для test.c?

1 Ответ

0 голосов
/ 24 января 2019

Даже если я не использую множественную функцию, вся общая библиотека math.so (включая несколько кодов и данных) все равно будет загружена в память

Не совсем верно.

Вся библиотека будет mmap добавлена ​​в ваш процесс.Однако в большинстве современных ОС используется требование подкачки , что означает, что код и данные не на самом деле загружаются в память до тех пор, пока к ним не будет произведен доступ.

Если общая библиотека большая (большечем одна страница (обычно 4 КБ или 8 КБ), и только одна функция из этой библиотеки доступна, то весьма вероятно, что неиспользуемые части библиотеки на самом деле не будут загружены в память.

Поскольку math.so совместно используется в памяти, как мы можем обращаться с глобальными данными в math.so?

Глобальные данные также mmap вводятся в ваш процесс, с копирование при записи семантика.

Если у вас есть два процесса, и каждый читает значение number, которое является глобальной переменной в math.so, оба процессабудет использовать (совместно использовать) ту же фактическую физическую страницу оперативной памяти.Но как только один из процессов записывает в number, для этого процесса будет выделена новая физическая страница ОЗУ (без разделения страницы), и обновление будет выполнено только для этого (сейчас)частное) копия.

...