Ограничение области действия глобальных символов от связанных объектов

У меня есть библиотека C в архиве, clib.a, Я написал оболочку для C ++, cpp.oи хотел бы использовать это как статическую библиотеку:

ar cTrvs cppwrap.a clib.a cpp.o

Код, который ссылается на это, не сможет использовать материал из clib.a непосредственно, если не включен правильный заголовок. Однако, если кто-то случайно создаст соответствующий прототип — например, void myCoincidentallyNamedGlobalFunction() — Я обеспокоен который значение myCoincidentallyNamedGlobalFunction будет применяться.

Поскольку символы из clib.a нужно только получить доступ в cpp.oи ничего не связано с cppwrap.aЕсть ли способ полностью скрыть их, чтобы избежать возможных столкновений (так что даже включение заголовка clib не удастся)?

4

Решение

Вы можете вручную удалить ненужные символы в окончательной объединенной библиотеке:

$ objcopy -N foo cppwrap.a (убрать символ)

Или, если вам нужны символы, но вы хотите убедиться, что внешние пользователи не могут получить к ним доступ:

$ objcopy -L bar cppwrap.a (локализовать символ)

Или, если символ в clib.a должен быть видимым чем-то в cpp.o но вы не хотите, чтобы это использовал кто-то еще:

$ objcopy -W baz cppwrap.a (ослабить символ)

В этом случае столкновения с символами из других объектных файлов / библиотек будут зависеть от их использования, даже если символ все еще будет виден. Чтобы еще больше затенить вещи или уменьшить вероятность даже косвенного столкновения, вы также можете использовать:

$ objcopy --redefine-sym old=new cppwrap.a

анонимное пространство имен может помочь в некоторых случаях, но не в том случае, если есть функциональность, которая нужна вашей оболочке, но пытается скрыть ее от внешних пользователей.

2

Другие решения