热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Deepin上编译5.10内核

在全新的deepin环境下makemenuconfig配置好内核,然后make编译的时候提示scriptssign-file.c:23:30:fatalerror:opensslo

在全新的deepin环境下 make menuconfig 配置好内核,然后 make 编译的时候提示 scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h ,需要安装 libssl-dev 软件包即可,可能还有其它提示,比如缺少 flex bison 包等,按照提示安装缺失的软件包即可。

安装完缺少的包后内核编译过程中提示

......
ld: kfd_iommu.c:(.text+0x43c): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
ld: kfd_iommu.c:(.text+0x44d): undefined reference to `amd_iommu_set_invalid_ppr_cb'
ld: kfd_iommu.c:(.text+0x4e2): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
......


在这里谷歌了一下 undefined reference to 的错误提示。

假设有 main.c test.c func.c三个文件,其中调用关系是main()->test()->func(),将test.c func.c编译成静态库后

gcc main.o -o main func.a test.a

复现 undefined reference to 问题。

原因:

编译过程是对独立的文件,并不检查函数的定义放在什么地方,也不会生成可以执行的文件,通常是生成.o(.obj)这样的文件。而链接则要根据.o文件生成可执行的程序或库。函数未定义这样的错误都是在链接过程中产生的。编译过程如果找不到一个函数的定义,它会认为这个函数的定义放在其它文件,而链接则一定要找到第个函数的定义。多个库文件在链接时就有了依赖性的问题。

在上面的例子中,由于是从.o文件生成了静态库,最后两个静态库的顺序是func.a test.a,当链接func.a时找到func函数,它并不依赖于其它的库,但链接到test.a时找到test函数,它依赖于func,然后就出现了依赖问题,因此可知gcc的链接顺序是被依赖的库放在其它库的后面,比如test依赖func,则func.a应该放到test.a的后面。

将上个命令改成以下命令即可正常链接。

gcc main.o -o main test.a func.a


在gentoo的bug反馈是当 CONFIG_DRM_AMDGPU=y时,CONFIG_AMD_IOMMU_V2=y也必须是Y,选为M不行,bug页面地址: https://bugs.gentoo.org/736994 添加完之后能正常编译通过。

编译完之后

make modules_install
make install #安装失败,提示找不到bzImage

原因是内核压缩选了zstd,但是系统没有安装zstd软件,安装之后重新编译安装成功。

重启后屏幕上只有一行

initramfs unpacking failed :compression method gzip not configured

查看配置文件 /etc/initramfs-tools/initramfs.conf 发现

#
# COMPRESS: [ gzip | bzip2 | lz4 | lzma | lzop | xz ]
#
COMPRESS=gzip

COMPRESS应该设置为zstd,但是这里没有ZSTD选项,initramfs-tools应该支持zstd吧,但是Debian的软件很多都很老,不支持zstd也能理解,在内核配置中将内核压缩,initramfs support修改为lz4, /etc/initramfs-tools/initramfs.conf 中修改为

COMPRESS=lz4

重新编译内核,安装模块和内核,重启会显示

initramfs unpacking failed: decoding failed

但是能够正常进入系统,demsg 除了常规的ACPI ,amdgpu 和PCI Error之外一切正常,这些应该是内核配置的问题。

自动生成的initramfs应该是有问题,重新生成一下,更新grub.cfg

update-initramfs -c -k $(uname -r)
grub-mkconfig -o /boot/grub/grub.cfg

重启正常进入系统,开机没有错误提示,但是deepin的logo不见了,我觉得可能是我在配置显卡驱动的时候添加了linux logo的支持,再开机的过程中显示linux logo,然后deepin 的logo就不显示了。



推荐阅读
author-avatar
mobiledu2502890617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有