Общая библиотека C ++ показывает внутренние символы

Я создал общую библиотеку (.dll, .so) с VC ++ 2008 и GCC. Проблема в том, что внутри обеих библиотек отображаются имена частных символов (классов, функций), и они не были экспортированы.

Я не хочу, чтобы в моем приложении отображалось имя классов / функций, которые не были экспортированы. Как я могу это сделать?

В GCC я сделал: скомпилирован с -fvisibility = hidden, а затем опубликован с помощью атрибута ((visibility ("default")))

В VC ++: __declspec (dllexport)

Спасибо!


person AllDayCpp    schedule 11.08.2009    source источник
comment
Если у вас нет привычки называть методы такими вещами, как TheClientIsAPinhead (), я действительно не понимаю, в чем ваша проблема.   -  person T.E.D.    schedule 11.08.2009
comment
Вы правы, но я параноик и не хочу, чтобы другие проверяли структуру программы с точки зрения классов и функций. Просто нужна общая библиотека, в которой есть только символы, которые были экспортированы.   -  person AllDayCpp    schedule 11.08.2009
comment
Что вы имеете в виду, когда говорите, что это видно? Что это?   -  person Rob Kennedy    schedule 12.08.2009
comment
В содержимом .dll или .so отображаются имена большинства классов и функций.   -  person AllDayCpp    schedule 12.08.2009
comment
Вы говорите, что, например, для сборки VC классы, которые вы не использовали __declspec (dllexport), все еще экспортировались? Как именно вы проверяете, что они экспортируются - Dependency Walker?   -  person jon-hanson    schedule 12.08.2009
comment
Символы экспортируются нормально. Проблема в том, что символы, которые не были экспортированы, появляются внутри .dll .so, и другие ppl могут читать имена моих классов и функций.   -  person AllDayCpp    schedule 12.08.2009


Ответы (3)


Для цепочек инструментов GNU вы можете использовать команду th strip для удаления символов из объектных файлов. Для управления его поведением требуются различные параметры команды. Он может делать то, что вы хотите.

person Steve K    schedule 11.08.2009

Вы можете создать файл заголовка, чтобы скрыть внутреннюю функцию и имена методов, которые вы хотите скрыть. То есть что-то вроде ниже (тоже нужно включить охранник)

#define someFunctionName1 sJkahe28273jwknd
#define someFunctionName2 lSKlajdwe98
#define someMethodName1   ksdKLJLKJl22fss
#define someMethodName2   lsk89hHHuhu7g

... и включите это в файлы заголовков, в которых находятся настоящие определения.

person epatel    schedule 11.08.2009
comment
Это непрактично делать это в большом проекте, и это загрязняет код определениями .. Злое решение .. - person AllDayCpp; 11.08.2009
comment
Я предлагаю хранить их в одном файле ... чтобы вам не приходилось их видеть. Позже вы не увидите их ни в каком коде, только включение в некоторые заголовки. Если вам нужно скрыть все функции / методы, вам может потребоваться какой-нибудь парсер для их извлечения. Если вы оставите некоторые важные основные функции, их можно будет обработать вручную. Дело в том, что код будет таким же, имена в двоичном файле будут запутаны. Вместо использования какого-либо случайного идентификатора можно написать другое имя функции / метода, которое, надеюсь, отбросит любую переработку, например calculateSecretKey () - ›prepareNewDatabase () - person epatel; 11.08.2009

Ключевое слово private, когда оно используется для спецификации доступа, эффективно работает только во время компиляции и предназначено для помощи программистам, а не для обеспечения безопасности - как вы выяснили, «конфиденциальность» реализуется с использованием лексических средств.

Легко видеть, что это должно быть так - если вы реализуете две частные функции с зависимостями друг от друга в двух отдельных файлах .cpp, компоновщик должен найти частные имена в результирующих файлах объекта (или библиотеки).

Итог - C ++ не имеет функций защиты кода - если вы дадите кому-то объектный код своей программы, они всегда смогут его изучить.

person Community    schedule 11.08.2009
comment
Я говорю о символах в исполняемом формате ELF или PE. Не личное ключевое слово. - person AllDayCpp; 11.08.2009
comment
Так, может быть, вам следует удалить тег C ++ из своего вопроса? - person ; 11.08.2009