Linux内核转储机制之确定makedumpfile源码编译

Linux内核转储机制之确定makedumpfile源码编译_第1张图片
makedumpfile
### 系统环境源码版本号:
  os:fedora28
  makedumpfile:1.6.4
  elfutils:0.142
下载源码与解决依赖
  • crash里编译安装后只有crash(makefile)。
  • rpm -qf makedumpfile 来自于kexec-tools包。
  • 查看kexec-tools.src.rli pm包内源码,发现有makedumpfile源码,后从github的makedumpfile链接找到makedumpfile最新版本下载。
  • 查看makedumpfile源码中的READEME文件,提示其依赖于elfutils使用编译出的头文件、库文件。
  • 编译elfutils时,出现"[-Werror=XXX-XXXX-XXXX=]"一系列的警告,解决方式时对CFLAGS添加“-Wno-XXX-XXX-XXX”。
make CFLAGS='-Wno-implicit-fallthrough -Wno-nonnull-compare -Wno-unused-but-set-variable -Wno-implicit-function-declaration -Wno-sizeof-array-argument -Wno-sizeof-pointer-memaccess'
  • 虽然在上一步解决[-Werror=XXX-XXX-XXX]类的问题后,又报出未声明的使用,但现在我需要的“头文件、库文件”已经出现,所以停止解决问题、后续编译。
strip.c: 在函数‘process_file’中:
strip.c:340:63: 错误:‘ACCESSPERMS’未声明(在此函数内第一次使用)
       result = handle_elf (fd, elf, NULL, fname, st.st_mode & ACCESSPERMS,
                                                               ^~~~~~~~~~~
strip.c:340:63: 附注:每个未声明的标识符在其出现的函数内只报告一次
make[2]: *** [Makefile:559:strip.o] 错误 1
make[2]: 离开目录“/home/loongson/download-makedumpfile/elfutils-0.142/src”
make[1]: *** [Makefile:297:all-recursive] 错误 1
make[1]: 离开目录“/home/loongson/download-makedumpfile/elfutils-0.142”
make: *** [Makefile:215:all] 错误 2
  • 进入makedumpfile源码目录,进行编译makedumpfile。出现缺少头文件,回到elfutils目录复制到指定目录。
### 报出问题
dwarf_info.c:17:10: 致命错误:elfutils/libdwfl.h:No such file or directory
 #include 
          ^~~~~~~~~~~~~~~~~~~~
编译中断。
make: *** [Makefile:74:dwarf_info.o] 错误 1
### 回到elfutils编译目录,进行复制头文件
cp ./libdwfl/libdwfl.h /usr/local/include/elfutils/
  • 解决头文件的依赖问题后继续编译,出现“-Wxxxx-xxx”的警告问题使用“-Wno-Wxxxx-xxx”解决后进行后续编译,出现库文件未不到。
### 使用“make CFLAGS='-Wno-Wstringop-truncation'”解决编译停止问题,后现象

cc -Wno-Wstringop-truncation  print_info.o dwarf_info.o elf_info.o erase_info.o sadump_info.o cache.o tools.o arch/arm.o arch/arm64.o arch/x86.o arch/x86_64.o arch/ia64.o arch/ppc64.o arch/s390x.o arch/ppc.o arch/sparc64.o -rdynamic -o makedumpfile makedumpfile.c -lpthread -static -ldw -lbz2 -lebl -ldl -lelf -lz
/usr/bin/ld: 找不到 -lpthread
/usr/bin/ld: 找不到 -lbz2
/usr/bin/ld: 找不到 -ldl
/usr/bin/ld: 找不到 -lz
/usr/bin/ld: 找不到 -lc
collect2: 错误:ld 返回 1
make: *** [Makefile:81:makedumpfile] 错误 1

问题:显示连接器在’编译‘链接时找不到库文件。

* 首先去看ld’编译‘链接时的搜索路径。
### 查看ld编译、运行时的指定库位置的变量。
LD_LIBRARY_PATH:指定库位置(运行时) - 导出LD_LIBRARY_PATH =“/ usr / lib64”
LD_RUN_PATH:指定库位置(编译) - 导出LD_RUN_PATH =“ / usr / lib64”

### /etc/ld.so.conf时运行时搜索的库位置。
  • 确定ld‘编译’链接时库文件搜索位置后,去确认编译指定位置是否有报错的“-lxxx”库文件。

  • 若编译链接指定库文件位置存在报错的“-lxxx”库文件,则检查软硬链接、版本号是否正确问题;若指定库文件位置不存在报错的“-lxxx”库文件,则去安装libxxx-dev包。

这里我要说明一下,我指定了make编译时的库链接位置“CFLAGS='L/usr/lib64'”我所需要的库文件也存在于“/usr/lib64”目录下,发现还是报“/usr/bin/ld: 找不到 -lxxxx”。

最后在cc编译配置中、Makefile找到原因,是其指定了“-static”参数,此参数是指定连接器去寻找静态库文件(.a文件)。
cc -Wno-Wstringop-truncation  print_info.o dwarf_info.o elf_info.o erase_info.o sadump_info.o cache.o tools.o arch/arm.o arch/arm64.o arch/x86.o arch/x86_64.o arch/ia64.o arch/ppc64.o arch/s390x.o arch/ppc.o arch/sparc64.o -rdynamic -o makedumpfile makedumpfile.c -lpthread -static -ldw -lbz2 -lebl -ldl -lelf -lz

把以上配置(去掉‘-static’)到命令行回车,一切正常,编译成功。

使用 编译好的 makedumpfile ,去研究源代码
  • ’man makedumpfile‘ ,现在开始使用 makedumpfile 搭配其命令参数,做实验。
  • 研究 ELF 文件格式。

你可能感兴趣的:(Linux内核转储机制之确定makedumpfile源码编译)