Как я могу напечатать переменные в определенном разделяемом? - PullRequest
0 голосов
/ 25 июня 2019

Чтобы упростить вещи, скажем, у меня есть следующее в xxx.c:

int foo = 0;

void bar() {
   ...
}

Условная компиляция внутри панели позволяет мне скомпилировать двумя способами.Я компилирую первым способом и создаю разделяемую библиотеку, назовем ее lib1.so.Затем я компилирую вторым способом и создаю другую разделяемую библиотеку, назовем ее lib2.so.Теперь я запускаю основную программу и динамически загружаю (dlopen) как lib1.so, так и lib2.so.Если я попрошу GDB «print foo», он выведет значение, но какое это будет?Я не могу квалифицировать foo с именем файла ('xxx.c' :: foo), потому что имя источника одинаково для обоих совместимых объектов.Есть ли способ указать gdb специально печатать foo из lib1.so или foo из lib2.so?

Если я установил точку останова на 'bar', gdb достаточно умен, чтобы установить 2 точки останова, одну вкаждый поделился.Поэтому я немного удивлен, что «print foo» не печатает одинаково два значения, по одному для каждого общего ресурса.

1 Ответ

0 голосов
/ 26 июня 2019

Как я могу печатать переменные в определенном совместном доступе?

Я не верю, что в настоящее время есть способ сделать это. Эта ошибка актуальна.

Примечание: если у вас есть внешняя переменная (то есть вы не использовали никаких специальных флагов, таких как -fvisibility-hidden или сценарий компоновщика, чтобы пометить foo скрытый), тогда все ссылки на foo будут привязаны к той библиотеке, которая была dlopen первой, поэтому из любого экземпляра bar будет использоваться только один экземпляр foo (это один из основных разница между тем, как работают общие библиотеки UNIX и библиотеки DLL Windows).

Конечно, вы можете искать другой экземпляр с помощью dlsym(..., "foo").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...