【问题标题】:Convert 32 bits .def file to 64 bits将 32 位 .def 文件转换为 64 位
【发布时间】:2011-01-05 15:16:16
【问题描述】:

在我公司,我们使用.def 文件来指定需要导出的符号。 (我希望我可以使用更现代和自动化的技术,不幸的是,那些决定生活在八十年代的人)。

手动编写.def 文件,使用手动复制粘贴既无聊又容易出错,但到目前为止我可以忍受。

但是,我需要为 DLL 的 64 位版本编写一个类似的 .def 文件。几个函数的名字修饰改变了,不知道有没有办法从32位版本生成64位版本的.def文件。

您知道任何可以帮助我的工具吗?这甚至是现实的吗?我真的不想再手动一次了。欢迎任何解决方案,即使是涉及编写我自己的工具的解决方案。

谢谢。

【问题讨论】:

  • 嘿,我也活在 80 年代!

标签: c++ visual-c++ function name-decoration


【解决方案1】:

我可能会 __declspec(dllexport) 我想要的符号,编译,然后在生成的 DLL 上运行 dumpbin /exports 以获取损坏的名称,然后您可以删除 __declspec 并制作一个 .def 文件。

【讨论】:

  • +1。谢谢你的主意。听起来很有效。但是,我想将对源代码的修改减少到最低限度。我想在不修改源代码的情况下使用宏有条件地放置/删除__declspec 语句应该可以吗?
  • 添加宏或添加 __declspec 将更改相同数量的代码。我认为那里没有任何风险。但是,如果您真的不想更改代码,我想您可以将其编译为调试,将在 DLL 上执行 loadlibrary 的 EXE 加载到 windbg 并执行“x Mymodule!*”,这将列出所有符号,然后您可以选择你想离开那里的那些。
【解决方案2】:

告诉你的老板回到 80 年代。说真的,这不是导出符号名称的可移植方式。如果 C++ 编译器更改名称修饰方案怎么办?然后你必须重新做这个(jcopenha 说的)。如果发生这种情况时你不在那里工作怎么办?另一个可怜的灵魂是否将不得不花费宝贵的时间来找出什么以及如何去做?我会尝试说服老板使用__declspec(dllexport)。现在可以节省时间,将来也可能节省时间。

我假设您正在导出类和重载函数。如果你不是,那么我会用 C 名称导出函数。这些名称没有被破坏,也不会改变。

【讨论】:

  • 我确实在导出类。他们想使用.def 文件来“隐藏”函数名称并改用序号(以防止用户猜测导出了哪些函数......)我相信这是一个糟糕的原因,它不会阻止任何有天赋的人“hacker”来查找函数签名。
  • 哎哟。好吧,我会尝试在构建过程中自动化它。创建一个使用 __declspec() 的单独构建解决方案(隐藏在一个宏中,在常规构建中扩展为空)。在输出上运行 dumpbin,并根据 dumpbin 结果创建一个 .def 文件,并将其合并到项目中。这样它就相当自动化了,如果你切换到不同的编译器也不会崩溃。您只需要记住使用宏即可。
  • 我不明白关于名称修改方案更改为 DEF 文件引入问题的评论背后的原因。我认为 DEF 文件将是一种避免名称重整更改问题的方法,因为当您使用 dllexport 时,您会得到重整的名称,但是当您使用 DEF 文件时,您指定名称,然后它们会进入根据我的经验,出口没有受到影响。
  • @BlueMonkMN 他正在导出 C++ 名称(损坏的名称)。好吧,您可以在导出中“重命名”它们,但您仍然必须指向损坏的 C++ 名称。这不值得。 (我认为微软的任何人都没有想过使用这样的 .def 文件)
  • 在我的 def 文件中,至少在处理导出简单全局函数的平面 dll 时,我只是列出了每个全局函数名称,这就是导出的名称。也许这本质上是 C 导出而不是 C++?
猜你喜欢
  • 2021-01-22
  • 2014-09-11
  • 1970-01-01
  • 2021-05-12
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
相关资源
最近更新 更多