作者:mobiledu2502890617 | 来源:互联网 | 2023-08-31 11:52
在全新的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就不显示了。