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

查看 47|回复 2
作者:222gh   
问题描述
项目编译器从 gcc9.3 切换到 clang11 ,原有的 drivers/pci 目录下有几个文件编译不过,于是用原本的编译器编译后拷贝过来,想着执行 make 时,这个文件夹已被编译过,就不会再被编译,结果 pci 文件夹再次被编译,继续报错。
尝试了 2 种办法:
[ol]
  • 利用 Makefile 确定文件是否需要被编译的时间关系:当目标文件比依赖文件新时,make 不再更新,故将 pci 用 gcc 编译后的所有文件,均用 touch 功能将时间改到 2000 年。再次执行编译时,该文件夹仍然被编译。
  • 注释掉 drivers 目录下,Makefile 中的 objm+= /pci ,由于 kernel 中其他文件,如需要引用 pci 中的.o 文件中的符号文件,故链接出错。
    [/ol]
    ld.lld: error: undefined symbol: pci_find_bus
    >>> referenced by pci.c:40 (kernel/arch/arm64/kernel/pci.c:40)
    求助
    如何让新编译器不再编译 pci 目录,同时执行链接时,能找到 pci 对应的.o 文件中的符号?

    pci, 编译, 文件, 编译器

  • pagxir   
    去好好解决报错。这种取巧办法只会让 bug 隐藏到运行时。内核数据结构的内存布局依赖于编译器,一个 kernel 是不允许用两个不同的编译器去编译的,除非你确定内存布局不会变。
    NessajCN   
    你问得是个 xy 问题。
    不要碰到解决不了的疑问先自己想当然地找个解决方法,搞不定又来问这个解决方法的解决方法
    你直接把你换编译器之后编译不过的原因发上来才是正确的求助方法
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部