【问题标题】:statically linked libraries on macmac上的静态链接库
【发布时间】:2013-05-23 15:47:19
【问题描述】:

我只是不明白。

我相信 gcc 在调用 gcc 驱动程序时会自动链接 libc.a。

但是,出于好奇,我想使用 -static 静态链接 libc.a,但我明白了;

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status

我只是不明白?另外,crt0 是什么?

我也读过帖子说 从不 静态链接 libc.a ;为什么?从我所读到的(诚然,我只是一名本科生),我没有看到静态链接的缺点..

我阅读了this 帖子,它告诉我添加似乎可以正确编译的-lc,但这是静态链接还是只是添加 libc.dylib?

此外,每当我使用-static 标志时,我都会收到从ld 返回的相同错误。我不明白?我正在阅读的文本显示了使用 Unix 环境的示例,并且由于 OS X 是基于 Unix 的,为什么我在使用 Mac 时遇到这么多困难?

谢谢,扎克

【问题讨论】:

    标签: c macos linker static-linking


    【解决方案1】:

    这是 Apple 关于库和开发工作方式的决定之一。它们通过使构建静态二进制文件尽可能困难来劝阻您。

    在http://developer.apple.com/ 上提供了一些弱酱解释,有用的花絮是:

    >     If your project absolutely must create a statically linked binary, 
    > you can get the Csu (C startup) module from [Darwin][2] and try
    > building crt0.o for yourself. Obviously, we won't support such an
    > endeavor.
    

    如果您觉得自己在逆流而上,请习惯它 - 因为应用沙盒、签名、dyld 更改等不会让您更轻松。

    从好的方面来说,现在尝试在 OSX 上做 unix 的东西是前卫和危险的。

    几个有用的链接:

    http://reverse.put.as/2013/03/20/how-to-compile-gdb-in-mountain-lion-updated/ http://www.osxbook.com/

    【讨论】:

    • 为什么创建一个静态链接的二进制文件会很危险,因为它们在苹果文档中被忽略了?
    • 创建静态链接的二进制文件并不危险——Apple 的“论点”似乎是“事情变化如此频繁,以至于您应该真正使用共享库,以便 API 更改不会破坏您的代码。'这是一个合理的论点——令人讨厌的是他们为阻止你做这件事(和其他事情)付出的努力。而且,不要误会我的意思,这里有两台 mac pro 台式机和一台 macpro 笔记本电脑 - 我爱我一些拉丝金属 unix。但是,做出这样的承诺意味着您需要付出很多额外的努力,如果您使用的是 Linux,则无需付出这些努力。
    • API 中的更改将如何影响静态链接的二进制文件?我不明白。静态链接的全部意义在于它产生了一个完全可加载/可执行的二进制文件?
    • 一个我能想到的历史示例 - 在 10.4 中,您曾经能够在没有任何特殊权限的情况下将 mach_inject 运行到任何 mach 进程中,因为您可以通过 sysctl 启用 KERN_TFP_POLICY_PERMISSIVE。在 10.5 中,他们删除了该选项。因此,如果您有一些期望该功能的静态代码 - 您将不走运。这种事情一直在发生。如果你在做超级通用的 UNIX 东西,是的,静态二进制文件应该能持续一段时间。但是,如果一个新的 OSX 版本出来并且你的东西坏了,不要感到惊讶。
    • 更可能的情况:在 OS 提供的库中发现了一个安全漏洞,并在 OS X 软件更新中修复。如果您的可执行文件是动态链接的,没问题。如果它是静态链接的,您的应用程序仍然容易受到安全问题的影响。如果您的应用程序已被许多人下载,那么问题就会成倍增加。
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多