У меня есть подключаемый модуль в виде общей библиотеки (bar.so), который подключается к большая программа (foo). И foo, и bar.so зависят от одной и той же сторонней библиотеки (baz), но им необходимо полностью разделять свои реализации baz. Поэтому, когда я связываю foo (используя предоставленные объектные файлы и архивы), мне нужно, чтобы он игнорировал любое использование baz в bar.so и наоборот.
Прямо сейчас, если я свяжу foo с - trace-symbol = baz_fun
, где baz_fun - один из оскорбительных символов. Я получаю следующий вывод:
bar.so: definition of baz_fun
foo/src.a(baz.o): reference to baz_fun
Я считаю, что это говорит мне, что foo ссылается на baz_fun из bar.so (и выполнение foo подтверждает это).
Решения, которые Я пробовал:
objcopy
для «локализации» интересующих символов: objcopy --localize-symbols = local.syms bar.so
где local.syms содержит все символы, представляющие интерес. Думаю, я здесь просто запутался, и, возможно, «местный» не означает то, что я думаю. Тем не менее, я получаю тот же результат по ссылке выше. Я должен отметить, что если я запустил инструмент nm
на bar.so до использования objcopy
, все рассматриваемые символы будут иметь флаг T
(верхний регистр указывает глобальный), а после objcopy
у них есть t
, указывающий, что они теперь локальны. Похоже, я правильно использую objcopy
. -fvisibility = hidden
, однако из-за некоторых других ограничений мне нужно использовать GCC 3.3, который, похоже, не поддерживает это особенность. Возможно, я смогу перейти на более новую версию GCC, но хотел бы получить подтверждение, что компиляция с этим флагом поможет мне, прежде чем идти по этому пути. Другое примечание: