Как ограничить доступ к символам в общем объекте?

У меня есть подключаемый модуль в виде общей библиотеки (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, но хотел бы получить подтверждение, что компиляция с этим флагом поможет мне, прежде чем идти по этому пути.

Другое примечание:

  • У меня нет доступа к исходному коду либо foo, либо baz
  • Я бы предпочел хранить весь мой плагин в одном общем объекте (bar.so). baz - фактически библиотека лицензирования, поэтому я не хочу, чтобы она разделялась
7
задан brady 1 June 2011 в 13:12
поделиться