У меня есть библиотека 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 не удастся)?
Вы можете вручную удалить ненужные символы в окончательной объединенной библиотеке:
$ 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
анонимное пространство имен может помочь в некоторых случаях, но не в том случае, если есть функциональность, которая нужна вашей оболочке, но пытается скрыть ее от внешних пользователей.