环境:CentOS8,使用redhat的spec文件编译4.19内核。

命令:rpmbuild -bb 4.19.0.src.rpm

解决方法:

1.查找没找到的符号所在模块,查看是否在.config文件中打开。

2.在rpmbuild/SOURCES/filter-modules.sh文件中有一个过滤名单,将出错的模块名添加到名单中,这样导出符号时会忽略这个模块,也不影响功能。要注意的是,在rpmbuild/SOURCES/目录下有好几个filter-*.sh文件,分别对应不同的架构,也需要修改。不然编译对应架构的包也会同样的错。

下面是较为详细的分析过程:

错误日志(部分,已模糊处理):

+ cat depmod.out
Depmod failure
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_new
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_limit_hw_rates
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_card_register
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_card_free
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_lib_preallocate_pages_for_all
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_hw_constraint_minmax
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_set_sync
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_card_new
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_lib_malloc_pages
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_lib_ioctl
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_lib_free_pages
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_card_free_when_closed
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_set_ops
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_suspend_all
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_card_disconnect
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_hw_constraint_integer
depmod: WARNING: /builddir/build/BUILDROOT/kernel-4.19.0/./lib/modules/kernel-4.19.0/kernel/drivers/gpu/drm/test/test.ko needs unknown symbol snd_pcm_period_elapsed
RPM build errors:

上面的错误是“needs unknown symbol *”,这个表示没有找到实现的函数,说明该函数对应的文件没有被编译或者加入内核代码中,通过以下几步确认相关问题(以上面的错误为例):

1.在内核代码目录使用“grep -rn snd_pcm_new”查找此函数的实现位置,在输出结果中可以找到这样一行:

sound/core/pcm.c:837:int snd_pcm_new(struct snd_card *card, const char *id, int device,

说明这个函数实现在sound/core/pcm.c文件。

2.接下来查看此文件是否被编译,结合sound/core目录的Makefile,查看是否存在对应的“.o”或“.ko”文件,有则说明已经被编译,理论上编译器已经找到了该文件。没有说明内核编译使用的config不对,里面对应的CONFIG_*项没有打开。

查看sound/core/Makefile,发现其生成文件对应的配置为CONFIG_SND_PCM,然后尝试打开就行了。

snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_misc.o \pcm_memory.o memalloc.o

(对应的Makefile部分,注意,snd-pcm-y即表示CONFIG_SND_PCM被打开,pcm.o是pcm.c对应的工程文件。字符名称有对应关系,感谢内核开发者。当然既可能是=y,也可能=m,取决于代码要不要被编进内核。)

打开.config,发现CONFIG_SND_PCM已经打开,因此说明内核已经有这个模块了。那就有可能是打包过程中的问题。

3.在rpmbuild/BUILDROOT/lib/modules/kernel/sound/core目录下面,发现没有任何ko文件,然后整个sound目录都没有ko文件,说明这个目录底下的模块都被删除了,这很有可能就是原因。

在rpmbuild/BUILDROOT/目录下有两个文件夹,lib和restore,restore由lib/modules/kernel复制得到,可以在restore下面找到sound目录的ko文件,而lib/modules/kernel没有,说明复制到restore之后,做了一些处理,删除了一些文件。

先尝试在rpmbuild/SOURCES/文件夹里找一下可能对kernel/sound目录操作的脚本,使用“grep -rn "kernel/sound"”。果然找到了一个脚本文件“filter-modules.sh”,看了一下内容,这个脚本负责删除一些指定模块,生成一个精简的内核便于导出内核符号,因此问题可能出在这里。找到对应“kernel/sound”的一行,如下:

# Just kill sound.
filter_dir $1 kernel/sound

注释说明这里确实删除了sound里的东西,分析其他部分的代码可知,这里的作用就是删除指定目录的模块,预设的数组如下:

driverdirs="atm auxdisplay bcma bluetooth firewire fmc iio infiniband isdn leds media memstick mfd mmc mtd nfc ntb pcmcia platform power ssb staging tty uio uwb w1"chardrvs="mwave pcmcia"netdrvs="appletalk can dsa hamradio ieee802154 irda ppp slip usb wireless"ethdrvs="3com adaptec alteon amd aquantia atheros broadcom cadence calxeda chelsio cisco dec dlink emulex icplus marvell neterion nvidia oki-semi packetengines qlogic rdc renesas sfc silan sis smsc stmicro sun tehuti ti wiznet xircom"inputdrvs="gameport tablet touchscreen"scsidrvs="aacraid aic7xxx aic94xx be2iscsi bfa bnx2i bnx2fc csiostor cxgbi esas2r fcoe fnic hisi_sas isci libsas lpfc megaraid mpt2sas mpt3sas mvsas pm8001 qla2xxx qla4xxx sym53c8xx_2 ufs qedf"usbdrvs="atm image misc serial wusbcore"fsdrvs="affs befs coda cramfs ecryptfs hfs hfsplus jfs minix ncpfs nilfs2 ocfs2 reiserfs romfs squashfs sysv ubifs ufs"netprots="6lowpan appletalk atm ax25 batman-adv bluetooth can dccp dsa ieee802154 irda l2tp mac80211 mac802154 mpls netrom nfc rds rfkill rose sctp smc wireless"drmdrvs="amd ast gma500 i2c i915 mgag200 nouveau radeon via"singlemods="ntb_netdev iscsi_ibft iscsi_boot_sysfs megaraid pmcraid qedi qla1280 9pnet_rdma rpcrdma nvmet-rdma nvme-rdma hid-picolcd hid-prodikeys hwa-hc hwpoison-inject hid-sensor-hub target_core_user sbp_target cxgbit iw_cxgb3 iw_cxgb4 cxgb3i cxgb3i cxgb3i_ddp cxgb4i chcr parport_serial ism"

对应的过滤脚本如下:

# Filter the drivers/ subsystems
for subsys in ${driverdirs}
dofilter_dir $1 drivers/${subsys}
done# Filter the networking drivers
for netdrv in ${netdrvs}
dofilter_dir $1 drivers/net/${netdrv}
done# Filter the char drivers
for char in ${chardrvs}
dofilter_dir $1 drivers/char/${input}
done# Filter the ethernet drivers
for eth in ${ethdrvs}
dofilter_dir $1 drivers/net/ethernet/${eth}
done# SCSI
for scsi in ${scsidrvs}
dofilter_dir $1 drivers/scsi/${scsi}
done# Input
for input in ${inputdrvs}
dofilter_dir $1 drivers/input/${input}
done# USB
for usb in ${usbdrvs}
dofilter_dir $1 drivers/usb/${usb}
done# Filesystems
for fs in ${fsdrvs}
dofilter_dir $1 fs/${fs}
done# Network protocols
for prot in ${netprots}
dofilter_dir $1 kernel/net/${prot}
done# DRM
for drm in ${drmdrvs}
dofilter_dir $1 drivers/gpu/drm/${drm}
done# Just kill sound.
filter_dir $1 kernel/sound

所以只要将报错的模块添加到对应的数组中,不用导出这个模块的符号,就可以避免这个问题。当然,也可以把缺少的部分模块从这些数组中去除,但是本例中需要去除的模块比较多,因此采用第一种方法。将test添加到数组drmdrvs中,因为都在同一个目录底下。

rpmbuild打包错误——needs unknown symbol *相关推荐

  1. Unknown symbol platform_driver_unregister (err 0)

    关于那个什么 Unknown symbol platform_driver_unregister (err 0) 等之类的错误,如果内核里有这个函数,比如(注意不一定是在 这个里面,具体看你编译的模块 ...

  2. insmod: error inserting './scull.ko': -1 Unknown symbol in module

    编译驱动的时候碰到了  insmod: error inserting './igb.ko': -1 Unknown symbol in module 的问题,在网上看了下,说是查看 dmesg |  ...

  3. unknown symbol in module, or unknown parameter

    Linux中我们加载驱动时,经常使用insmod指令来加载驱动ko文件,不过有时加载时,会弹出一些错误提示,例如我想导入pppoe的ko文件,使用insmod pppoe.ko,报错如下 insmod ...

  4. rpmbuild打包rpm

    一.rpmbuild及rpm rpm          rpm命令 是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功 ...

  5. insmod: error inserting 'myvivi.ko': -1 Unknown symbol in module 问题解决办法

    加载驱动时遇到:insmod: error inserting 'myvivi.ko': -1 Unknown symbol in module的问题,在网上查了下,解决办法如下: 1.用modinf ...

  6. electron builder 打包错误 cannot unpack electron zip file 解决方案

    electron builder 打包错误 cannot unpack electron zip file 解决方案 参考文章: (1)electron builder 打包错误 cannot unp ...

  7. Java---报错The type List is not generic; it cannot be parameterized with arguments <Role>==List打包错误

    提示The type List is not generic; it cannot be parameterized with arguments 错误. 翻译:类型列表不是泛型:不能用参数参数化它 ...

  8. iOS打包错误The operation couldn’t be completed. (AppThinning.StubError error 1.)

    1.iOS打包错误 iOS打包报错:The operation couldn't be completed. (AppThinning.StubError error 1.) 操作流程:archive ...

  9. Mysql 错误 1273 Unknown collation

    Mysql 错误 1273 Unknown collation 这是因为语句里创建表的collation与库的不一致,检查下库的和sql语句中collation,设置为一致即可!

最新文章

  1. 大话android 进程通信之AIDL
  2. 直接路径读取对于延迟块清除的影响
  3. 《windows server 2008》FTP服务器搭建
  4. webpack2+React 实例demo
  5. 2019年我总结的前端面试题
  6. UVA - 1378 A Funny Stone Game(博弈+sg函数)
  7. android顶部导航高度,Android特效——————底部/顶部导航条(Fragment+ViewPaper+XTabLayout)...
  8. 【程序设计】前置检测循环和后置检测循环
  9. 【flink】Flink常见Checkpoint超时问题排查思路
  10. Cisco STP生成树协议
  11. 简单整理 - 常用设计模式
  12. IDEA反编译java.class文件
  13. 在IEEE 上发表会议论文需要注意的几个事情
  14. Android 永久保存数据
  15. C/S模型(客户/服务器模型)
  16. 【HTTP Status 500 - Servlet execution threw an exception】
  17. Tomcat:Tomcat网站上的core和deployer的区别
  18. self和[self class]
  19. autocad.net 设置指定图层为当前图层
  20. 基于QT实现的简单版控制台植物大战僵尸

热门文章

  1. 雨课堂卷子提前看_雨课堂怎么新建试卷 制作试题的方法
  2. Android之C面试题②照片墙应用实现,再多的图片也不怕崩溃
  3. 纯CSS如何让图片以及DIV垂直居中显示
  4. 学习ThinkPHP3.2.2:video8,用M函数的delete方法删除wish表中的所有数据
  5. 史上最经典的IT入门学习教程DVD光盘免费领!
  6. 有没有一个企鹅软件,到哪里下载
  7. 百度地图-极速版搭建手册
  8. 腾讯阿里小米红包哪家强,这里有最强抢包攻略
  9. 丘仕达在第二页上快乐着
  10. 某些Office 精简版 Win7运行问题(Windows7 不支持 Thinstall)