### 系统环境源码版本号:
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 <elfutils/libdwfl.h>
^~~~~~~~~~~~~~~~~~~~
编译中断。
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 文件格式。
网友评论