我试图从源代码编译 Linux 内核。我之前编译过内核,从未出现任何错误。但这一次我遇到了错误。错误是
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
HOSTCC scripts/sign-file
/tmp/cczyW3hq.o: In function `main':
sign-file.c:(.text.startup+0x52): undefined reference to `OPENSSL_init_crypto'
sign-file.c:(.text.startup+0x5e): undefined reference to `OPENSSL_init_crypto'
sign-file.c:(.text.startup+0x247): undefined reference to `OPENSSL_init_crypto'
collect2: error: ld returned 1 exit status
scripts/Makefile.host:91: recipe for target 'scripts/sign-file' failed
make[1]: [scripts/sign-file] Error 1
当我检查scripts/sign-file.c时,我看到评论说Sign a module file using the given key.
。所以我重新出发make menuconfig
,然后出发Module signature verification
。并尝试再次编译。现在,以前的错误已被删除,但出现了新的错误,该错误与上面相同,但在不同的文件上。这是错误,
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
HOSTCC scripts/extract-cert
/tmp/ccA63AAC.o: In function `main':
extract-cert.c:(.text.startup+0x25): undefined reference to `OPENSSL_init_crypto'
extract-cert.c:(.text.startup+0x31): undefined reference to `OPENSSL_init_crypto'
collect2: error: ld returned 1 exit status
scripts/Makefile.host:91: recipe for target 'scripts/extract-cert' failed
make[1]: *** [scripts/extract-cert] Error 1
Makefile:556: recipe for target 'scripts' failed
make: *** [scripts] Error 2
所以我想知道这个问题是否是由于libssl
配置错误造成的?我正在使用Ubuntu 16.04LTS
与gcc-5.3.1
.
编辑:我尝试重新安装 libssl-dev 并尝试从源代码编译 openssl 然后也进行安装。我已将配置文件从/boot/config-4.4.0-22-generic
源目录复制到。
更新:make scripts V=1
以下是输出:
make -f ./scripts/Makefile.build obj=scripts/basic
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.asm-generic \
src=asm obj=arch/x86/include/generated/asm
make -f ./scripts/Makefile.asm-generic \
src=uapi/asm obj=arch/x86/include/generated/uapi/asm
make -f ./scripts/Makefile.build obj=scripts
make -f ./scripts/Makefile.build obj=scripts/gdb
make -f ./scripts/Makefile.build obj=scripts/gdb/linux
make -f ./scripts/Makefile.build obj=scripts/genksyms
make -f ./scripts/Makefile.build obj=scripts/mod
make -f ./scripts/Makefile.build obj=scripts/selinux
make -f ./scripts/Makefile.build obj=scripts/selinux/genheaders
make -f ./scripts/Makefile.build obj=scripts/selinux/mdp
gcc -Wp,-MD,scripts/.sign-file.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89 -I./tools/include -o scripts/sign-file scripts/sign-file.c -lcrypto
/tmp/cc7o2Y1C.o: In function `main':
sign-file.c:(.text.startup+0x52): undefined reference to `OPENSSL_init_crypto'
sign-file.c:(.text.startup+0x5e): undefined reference to `OPENSSL_init_crypto'
sign-file.c:(.text.startup+0x247): undefined reference to `OPENSSL_init_crypto'
collect2: error: ld returned 1 exit status
scripts/Makefile.host:91: recipe for target 'scripts/sign-file' failed
make[1]: *** [scripts/sign-file] Error 1
Makefile:556: recipe for target 'scripts' failed
make: *** [scripts] Error 2
答案1
由于您启用了内核模块签名,内核编译过程也会尝试生成该sign-file
工具 - 这需要 OpenSSL 库。
更具体地说,编译任何需要 OpenSSL 的内容意味着您应该拥有开发包首先安装OpenSSL(通常为openssl-dev
或openssl-devel
,取决于发行版)。
答案2
您必须确保 libssl 和 libcrypto 的符号链接已更新。您应该执行以下操作:搜索所有出现的 libssl.so 和 libcrypto.so
对于它们中的每一个,请查看它们是否链接到正确版本的 libssl。 libssl.so.1.1 在您的情况下(libssl.so.1.1 必须存在)。
如果他们的目标是旧版本,请删除该链接并创建一个新版本
ln -s libssl.so.1.1 libssl.so
libcrytpo 也是如此。
确保搜索所有出现的 libssl.so (你永远不知道你的代码从哪里获取它)
答案3
我希望您使用的是旧版本的 openssl,它没有 API OPENSSL_init_crypto
。
openssl/crypto.h
在/usr/include
或中找到 openssl 头文件,/usr/local/include
并检查OPENSSL_init_crypto
头文件中是否存在 API 原型(您可以像下面提到的那样使用 grep )。
grep OPENSSL_init_crypto /usr/include -R
grep OPENSSL_init_crypto /usr/local/include -R
如果上述 2 个grep
命令没有给出结果,则说明您没有安装 openssl 或者安装了较旧的 openssl 版本。
- 所以下载最新的 openssl-1.1.1 从这里 并使用以下命令安装。
tar -xvf <openssl_tar_package>
./config
make
make install