V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
222gh
V2EX  ›  程序员

Linux 内核编译时,如何让 drivers/pci 目录不再被编译,同时 make 能找到其中的.o 中的符号

  •  
  •   222gh · 240 天前 · 634 次点击
    这是一个创建于 240 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    项目编译器从 gcc9.3 切换到 clang11 ,原有的 drivers/pci 目录下有几个文件编译不过,于是用原本的编译器编译后拷贝过来,想着执行 make 时,这个文件夹已被编译过,就不会再被编译,结果 pci 文件夹再次被编译,继续报错。

    尝试了 2 种办法:

    1. 利用 Makefile 确定文件是否需要被编译的时间关系:当目标文件比依赖文件新时,make 不再更新,故将 pci 用 gcc 编译后的所有文件,均用 touch 功能将时间改到 2000 年。再次执行编译时,该文件夹仍然被编译。
    2. 注释掉 drivers 目录下,Makefile 中的 objm+= /pci ,由于 kernel 中其他文件,如需要引用 pci 中的.o 文件中的符号文件,故链接出错。
    ld.lld: error: undefined symbol: pci_find_bus
    >>> referenced by pci.c:40 (kernel/arch/arm64/kernel/pci.c:40)
    

    求助

    如何让新编译器不再编译 pci 目录,同时执行链接时,能找到 pci 对应的.o 文件中的符号?

    2 条回复    2023-09-01 14:36:22 +08:00
    pagxir
        1
    pagxir  
       240 天前 via Android
    去好好解决报错。这种取巧办法只会让 bug 隐藏到运行时。内核数据结构的内存布局依赖于编译器,一个 kernel 是不允许用两个不同的编译器去编译的,除非你确定内存布局不会变。
    NessajCN
        2
    NessajCN  
       240 天前
    你问得是个 xy 问题。
    不要碰到解决不了的疑问先自己想当然地找个解决方法,搞不定又来问这个解决方法的解决方法
    你直接把你换编译器之后编译不过的原因发上来才是正确的求助方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2436 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:04 · PVG 00:04 · LAX 09:04 · JFK 12:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.