Deepin上编译5.10内核
<p>在全新的deepin环境下 <code>make menuconfig</code> 配置好内核,然后 <code>make</code> 编译的时候提示 <code>scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h</code> ,需要安装 <code>libssl-dev</code> 软件包即可,可能还有其它提示,比如缺少 <code>flex bison</code> 包等,按照提示安装缺失的软件包即可。</p><p>安装完缺少的包后内核编译过程中提示</p>
<pre><code>......
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'
......
</code></pre>
<hr>
<p>在这里谷歌了一下 <code>undefined reference to</code> 的错误提示。<br>
假设有 main.c test.c func.c三个文件,其中调用关系是main()->test()->func(),将test.c func.c编译成静态库后</p>
<pre><code>gcc main.o -o main func.a test.a
</code></pre>
<p>复现 undefined reference to 问题。<br>
<strong>原因:</strong><br>
编译过程是对独立的文件,并不检查函数的定义放在什么地方,也不会生成可以执行的文件,通常是生成.o(.obj)这样的文件。而链接则要根据.o文件生成可执行的程序或库。函数未定义这样的错误都是在链接过程中产生的。编译过程如果找不到一个函数的定义,它会认为这个函数的定义放在其它文件,而链接则一定要找到第个函数的定义。多个库文件在链接时就有了依赖性的问题。<br>
在上面的例子中,由于是从.o文件生成了静态库,最后两个静态库的顺序是func.atest.a,当链接func.a时找到func函数,它并不依赖于其它的库,但链接到test.a时找到test函数,它依赖于func,然后就出现了依赖问题,因此可知gcc的链接顺序是被依赖的库放在其它库的后面,比如test依赖func,则func.a应该放到test.a的后面。<br>
将上个命令改成以下命令即可正常链接。</p>
<pre><code>gcc main.o -o main test.a func.a
</code></pre>
<hr>
<p>在gentoo的bug反馈是当 <code>CONFIG_DRM_AMDGPU=y</code>时,<code>CONFIG_AMD_IOMMU_V2=y</code>也必须是Y,选为M不行,bug页面地址: https://bugs.gentoo.org/736994 添加完之后能正常编译通过。</p>
<p>编译完之后</p>
<pre><code>make modules_install
make install #安装失败,提示找不到bzImage
</code></pre>
<p>原因是内核压缩选了zstd,但是系统没有安装zstd软件,安装之后重新编译安装成功。</p>
<p>重启后屏幕上只有一行</p>
<pre><code>initramfs unpacking failed :compression method gzip not configured
</code></pre>
<p>查看配置文件 <code>/etc/initramfs-tools/initramfs.conf</code> 发现</p>
<pre><code>#
# COMPRESS: [ gzip | bzip2 | lz4 | lzma | lzop | xz ]
#
COMPRESS=gzip
</code></pre>
<p>COMPRESS应该设置为zstd,但是这里没有ZSTD选项,initramfs-tools应该支持zstd吧,但是Debian的软件很多都很老,不支持zstd也能理解,在内核配置中将内核压缩,initramfs support修改为lz4, <code>/etc/initramfs-tools/initramfs.conf</code> 中修改为</p>
<pre><code>COMPRESS=lz4
</code></pre>
<p>重新编译内核,安装模块和内核,重启会显示</p>
<pre><code>initramfs unpacking failed: decoding failed
</code></pre>
<p>但是能够正常进入系统,<code>demsg</code> 除了常规的ACPI ,amdgpu 和PCI Error之外一切正常,这些应该是内核配置的问题。<br>
自动生成的initramfs应该是有问题,重新生成一下,更新grub.cfg</p>
<pre><code>update-initramfs -c -k $(uname -r)
grub-mkconfig -o /boot/grub/grub.cfg
</code></pre>
<p>重启正常进入系统,开机没有错误提示,但是deepin的logo不见了,我觉得可能是我在配置显卡驱动的时候添加了linux logo的支持,再开机的过程中显示linux logo,然后deepin 的logo就不显示了。</p><br><br>
来源:https://www.cnblogs.com/ditvelo/p/14756652.html
頁:
[1]