无法编译 Linux 内核 4.7-rc2

无法编译 Linux 内核 4.7-rc2

我试图从源代码编译 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.04LTSgcc-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-devopenssl-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

  1. 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 版本。

  1. 所以下载最新的 openssl-1.1.1 从这里 并使用以下命令安装。
tar -xvf <openssl_tar_package>
./config
make
make install

相关内容