2009-08-11 58 views
2

我用VC++ 2008和GCC构建了共享库(.dll,.so)。 问题是,在两个库中它显示私有符号(类,函数)的名称,它们不会被导出。C++共享库显示内部符号

我不希望我的应用程序显示未导出的类/函数的名称。 有什么办法可以做到这一点?

在GCC我没有: 编译时-fvisibility =隐藏,然后由公众属性((可见性( “默认”)))

在VC++: __declspec(DLLEXPORT)

谢谢!

+1

除非你习惯于像TheClientIsAPinhead()这样的命名方法,否则我真的不知道你的问题是什么。 – 2009-08-11 17:43:20

+0

你有一个点,但我是偏执狂,不希望其他人根据类和函数检查程序的结构。只需要一个共享库,只有导出的符号。 – AllDayCpp 2009-08-11 18:07:19

+0

当你说“它显示”时,你是什么意思?它是什么”? – 2009-08-11 20:17:28

回答

1

对于GNU工具链,您可以使用th strip命令从对象文件中删除符号。它需要各种命令选项来控制其行为。它可以做你想做的事。

+0

已经做到了。它删除了一些符号,但不是全部! – AllDayCpp 2009-08-11 17:59:03

0

私人关键字仅用于访问规范时 在编译时有效地工作,旨在帮助程序员,而不是安全功能 - 因为您发现使用词法方式实现了“隐私” 。

很容易看出这一点 - 如果在两个单独的.cpp文件中实现两个相互依赖的私有函数,链接器必须在生成的对象(或库)文件中查找专用名称。

底线 - C++没有代码的安全功能 - 如果你给别人你的程序的目标代码,他们随时都可以检查它。

+0

我正在谈论ELF或PE可执行格式的符号。不是私人关键字。 – AllDayCpp 2009-08-11 17:59:57

+0

所以,也许你应该从你的问题中删除C++标签? – 2009-08-11 18:04:05

1

您可以创建一个头文件来混淆要隐藏的函数和方法名称的内部。即像下面的东西(需要一些包括警卫)

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

...并将其包含在真正定义所在的头文件中。

+0

在大型项目中执行它并不实际,它会用定义..恶魔解决方案污染代码。 – AllDayCpp 2009-08-11 17:58:01

+0

我的建议是将它们保存在单个文件中..所以您不需要看到它们。您稍后在任何代码中都不会看到它们,只是在某些标题中包含“include”。如果您需要混淆所有可能需要使用某个解析器来提取它们的函数/方法。如果你保持它的一些重要的核心功能,他们应该没问题手动处理。事情是代码将是相同的,在二进制文件中的名称将被混淆。而不是使用一些随机标识符,可以写一些不同的函数/方法名称,希望抛出任何重新设计,例如calculateSecretKey() - > prepareNewDatabase() – epatel 2009-08-11 18:18:48