【问题标题】:Why are Cygwin import libraries installed with mode 755?为什么 Cygwin 导入库安装模式为 755?
【发布时间】:2012-06-22 15:36:16
【问题描述】:

我有一个最初为 Linux 开发的库。我现在正在将其移植到 Cygwin。我注意到我的 Cygwin 系统上的每个库都是这样安装的:

  • DLL (cygfoo.dll) 安装到/usr/bin 模式755
  • 静态存档 (libfoo.a) 安装到 /usr/lib 模式 644
  • 导入库(libfoo.dll.a)安装到/usr/lib模式755

前两个对我来说很有意义。 DLL 是可执行文件,所以它们应该是模式 755。静态存档不是可执行文件,所以它们是模式 644。然而,第三个对我来说似乎很奇怪。导入库实际上是静态存档,而不是可执行文件(ar -t libfoo.dll.a 列出了存档的内容)。不应该也安装模式644吗?

为什么 Cygwin 的约定是安装模式为 755 的导入库?

【问题讨论】:

  • @Wooble:那是因为.dylibs 和.sos 可执行文件。档案不是。
  • 您可以尝试将其中一个关键的 dll.a 文件更改为 644,看看它会在哪里中断,如果它坏了。
  • @DanMoulding, library 是 2012 年标签清理的一部分。请不要重新创建它。
  • @Charles:我强烈反对删除。这不是社区决定,而是在没有充分理由的情况下强加给我们(当然,没有人会知道这一点,因为所有证据都已被这种无情杀害无辜标签的肇事者摧毁)。请停止删除它。程序员不能来 SO 来询问、学习和教授作为主要学科的库,这有点可笑。有很多要问、要学习和要教的内容,例如:设计、实施、安装
  • @DanMoulding,不幸的是标签被滥用了,我完全支持让它死掉。它用来谈论设计和实现,而是“我需要 X 的库”或“我正在使用 X 库”,其中 X 是另一个标签。在一般用途中,它在问题中添加了 nothing。你提到的东西完全是主题,但是当它继续被不知情的用户滥用时,使用名为“库”的标签来分类相关问题将再次适得其反。

标签: cygwin libraries file-permissions


【解决方案1】:

这是 Windows 要求:由于 .dll 文件包含将要执行的代码,因此需要设置可执行位。

删除执行文件的权限,Windows 不会让其中的任何代码被执行,即使执行的进程是分开的。

旁注:一个常见的误解是 Windows 没有 +x 位。这在技术上是正确的; Windows 不使用 POSIX rwx 权限,尽管 Cygwin 确实尝试提供类似于它们的界面。但是,Windows 确实使用 ACL(访问控制列表)来获取权限,并且这些确实具有“执行权限”的概念,这就是 Cygwin 映射到其 +x 位的内容。

Cygwin 邮件列表上有一个long discussion 与此相关,如果您想获取资源/进一步阅读。

【讨论】:

  • 这对于 /usr/bin 中的 DLL 来说非常有意义。但我不是在询问 DLL。我在询问安装到 /usr/lib 的导入库(*.dll.a,相当于 MSVC *.lib)。我会澄清这个问题。
【解决方案2】:

我唯一想到的答案是安装程序正在寻找文件名中的“.dll”字符串以激活复制文件的可执行属性 (x)... 应该寻找 /.+\。 dll$/(.dll 仅在末尾)。

操作系统/文件系统之间的阻抗不匹配迫使安装程序/复制者在安装程序操作中确定属性值是可以理解的(这比必须将属性列表映射到复制的文件更容易......和在 Windows 中只需查找 .exe、.com 和 .dll)

要确认这一点,请将您的“libfoo.dll.a”重命名为“libfoo.dxx.a”并进行测试...

【讨论】:

    【解决方案3】:

    回到 2000 年:

    在 NTFS 分区上,NT/W2K 需要 DLL 的执行权限才能执行 允许在进程启动时加载 DLL。

    这没问题,除非使用 ntsec 的人获得 tar 存档 由不使用ntsec 的人打包或打包在 FAT 分区上。 由于 Cygwin 仅伪造后缀“exe”的执行权限, “bat”、“com”、DLL 被 stat() 调用视为不可执行 当ntsec 未设置时。

    当使用 ntsec 的人解压该 tar 存档时,一个 需要存档中的 DLL 之一的应用程序将失败 带有 Windows 消息

    “应用程序初始化失败(0xc0000022)”

    这对大多数用户来说意义不大。

    要解决这个问题,我们必须做一个简单的步骤。假执行 未设置 ntsec 或文件系统未设置时的 DLL 权限 支持 ACL (FAT/FAT32)。

    这里:http://cygwin.com/ml/cygwin-developers/2000-10/msg00044.html

    【讨论】:

      【解决方案4】:

      似乎这只是一个懒惰的黑客行为,导致包含“.dll”的文件名出现这种行为。有关“修复”背后的原因,请参阅 hasanyasin 的回答 (here)。

      【讨论】:

        猜你喜欢
        • 2014-10-22
        • 2016-11-20
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        相关资源
        最近更新 更多