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

255 天前
 222gh

问题描述

项目编译器从 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 文件中的符号?

647 次点击
所在节点    程序员
2 条回复
pagxir
255 天前
去好好解决报错。这种取巧办法只会让 bug 隐藏到运行时。内核数据结构的内存布局依赖于编译器,一个 kernel 是不允许用两个不同的编译器去编译的,除非你确定内存布局不会变。
NessajCN
255 天前
你问得是个 xy 问题。
不要碰到解决不了的疑问先自己想当然地找个解决方法,搞不定又来问这个解决方法的解决方法
你直接把你换编译器之后编译不过的原因发上来才是正确的求助方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/969991

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX