【问题标题】:Kext compiled fine with symbols undefinedKext 编译良好,符号未定义
【发布时间】:2014-10-02 05:39:35
【问题描述】:

我最近正在为 osx 10.9 编写一个内核模块,发现我编译的最终二进制文件中的每个符号都没有被 nm 工具定义。

如何通过在构建设置中指定标志来完成?我的意思是,当您构建用户模式应用程序时,如果符号未解析,则无法正确链接。我在构建 kext 二进制文件的命令行中找不到任何相关标志。

只是出于好奇,这个告诉链接器任何未定义符号都可以的标志在哪里?我知道 --unresolved-symbols 标志,但在构建命令行中找不到它。

此外,我如何直接链接到 mach_kernel?因为我刚刚看到一个链接到 macho 的 osx 10.5 驱动程序。还是只有在过去才有可能?

【问题讨论】:

    标签: c++ macos clang kernel-extension


    【解决方案1】:

    为 kext 完成此操作的标志是 -Xlinker -kext,它还包括选项 -nostdlib,因为基本标准库不适用于 kext。这些规则告诉 OSX 链接器它不需要解析生成的二进制文件中的所有符号。

    直接链接到内核,您依赖于在 kext 加载时而不是在任何其他时间连接的未定义符号。

    【讨论】:

    • 感谢您的回答。来自 osx book 的 XBinary 有一个链接到 macho(mach_kernel) 的 kext。 osxbook.com/software/xbinary 适用于 osx 10.5 豹。旧的kext是否直接链接?它没有提供来源,所以我没有什么可以挖掘的。
    • 64bit 的界面变化很大,所以我相信(但我愿意更正)你不能再直接链接到它了。您还需要定义在 kext 的 info.plist 的 OSBundleLibraries 键中使用的内核编程接口。您可以通过在构建的 kext 上运行 kextlibs 来确定这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 2010-12-31
    • 2015-05-23
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多