-
问题描述:我根据《操作系统真象还原》一书编写完一段死循环系统内核c源文件之后,使用deepin20.9自带gcc8.3.0和binutils2.31.1中的ld对该源文件进行编译和链接。最终得到的可执行文件中程序头表描述与书中不同,我得到表中条目也就是程序头总共有4个,而书中只有2个,且第一个段起始虚拟地址为0x080040000而非0xc0001000。
-
问题原因:ld连接器版本过高导致
-
解决办法:降低系统binutils版本或者编译一个低版本binutils工具,利用工具中的ld链接器进行链接。
降低有风险,所以本文采用编译一个低版本binutils使用,我这里以binutils2.26版本为例:
-
去官网下载压缩包:http://ftp.gnu.org/gnu/binutils/binutils-2.26.1.tar.bz2
-
解压后重命名解压目录为binutils2.26
-
进入解压目录:
cd ./binutils-2.26
-
创建build文件夹:
mkdir build
-
通过 configure 生成 makefile 文件,以及设置 make install 时的安装路径
./configure --prefix=上一步创建的build文件夹的绝对路径
说明,我这里是不想安装到系统环境下,所以安装目录选择在了解压目录下创建的build文件中即–
prefix=build文件夹的绝对路径
。 -
编译:
make -j
-
安装:
make install
-
安装结束后可以进入build目录的bin目录下,在终端打开,输入
ld -v
即可查看当前ld版本。
-
-
可能会出的错:
-
问题1:由于我用的是deppin20.0.9,其自带的gcc版本为8.3.0,所以在执行上述
make -j
时会出现大量的报错,这是因为gcc版本太高了需要手动降版本。 -
问题2:其次,根据网上教程降低gcc版本,修改/etc/apt/sources.list文件后,使用apt-get update 更新ubuntu时,出现下面的错误:
W: GPG 错误:http://mirrors.aliyun.com/ubuntu xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32 E: 仓库 “http://mirrors.aliyun.com/ubuntu xenial InRelease” 没有数字签名。 N: 无法安全地用该源进行更新,所以默认禁用该源。 N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。
原因是在本地没有40976EAF437D05B5的公有key,可以使用下面的命令:
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5 3B4FE6ACC0B21F32
-
了解完问题后我们开始进行降低gcc并重新编译安装:
-
修改/etc/apt/sources.list文件,在文件末尾新增:
deb http://dk.archive.ubuntu.com/ubuntu/ trusty main universe deb http://dk.archive.ubuntu.com/ubuntu/ trusty-updates main universe
-
保存退出后在终端输入:
sudo apt-get update
,如果报错请参看上述问题2. -
执行命令安装gcc4.4:
sudo apt-get install g++-4.4
-
优先级设定:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40
(40为优先级, 高优先)sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 30
(把自带的设为30) -
gcc -v
查看当前gcc版本 -
选择不同版本:
update-alternatives --config gcc
-
进入解压目录:
cd ./binutils-2.26
-
先清除一下之前make产生的文件:
make clean
-
重新编译:
make -j
-
安装:
make install
-
-
2023-07-12 关于gcc编译C语言系统内核文件经过ld链接后出现的问题
于 2023-07-27 17:33:33 首次发布