【问题标题】:C++ shared library shows internal symbolsC++ 共享库显示内部符号
【发布时间】:2010-11-18 16:40:10
【问题描述】:

我已经使用 VC++2008 和 GCC 构建了一个共享库(.dll、.so)。 问题是在两个库中它都显示了私有符号(类、函数)的名称,并且它们没有被导出。

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

在 GCC 我做了: 使用 -fvisibility=hidden 编译,然后使用 attribute ((visibility("default")))

公开

在 VC++ 中: __declspec(dllexport)

谢谢!

【问题讨论】:

  • 除非你习惯于命名方法,比如 TheClientIsAPinhead(),否则我真的不明白你的问题是什么。
  • 你说得有道理,但我很偏执,不希望其他人检查程序在类和函数方面的结构。只需要一个只包含导出符号的共享库。
  • 你说“它显示”是什么意思? “它”是什么?
  • 在.dll或.so的内容中显示了大部分类和函数的名称。
  • 您是说,例如,对于 VC 构建,您没有 __declspec(dllexport) 的类仍在导出?您如何检查它们是否被导出 - Dependency Walker?

标签: c++ linker shared-libraries


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    仅用于访问规范时的私有关键字 在编译时有效工作,旨在帮助程序员,而不是安全功能 - 正如您发现“隐私”已实现 使用词汇手段。

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

    底线 - C++ 没有代码安全功能 - 如果您将程序的目标代码提供给某人,他们将始终能够检查它。

    【讨论】:

    • 我说的是 ELF 或 PE 可执行格式的符号。不是私有关键字。
    • 所以也许你应该从你的问题中删除 C++ 标签?
    【解决方案3】:

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

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

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

    【讨论】:

    • 在大型项目中这样做是不切实际的,它会用定义污染代码..邪恶的解决方案..
    • 我的建议是将它们保存在一个文件中......所以你不需要看到它们。稍后您将不会在任何代码中看到它们,仅在某些标头中出现“包含”。如果您需要混淆所有函数/方法,您可能需要使用一些解析器来提取它们。如果您将其保留为一些重要的核心功能,则手动处理它们应该没问题。问题是代码相同,二进制文件中的名称将被混淆。可以编写一些不同的函数/方法名称,而不是使用一些随机标识符,希望能摆脱任何重新设计,即 calculateSecretKey()->prepareNewDatabase()
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2018-04-14
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多