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

2018-08-10  本文已影响0人  2puT
makedumpfile
### 系统环境源码版本号:
  os:fedora28
  makedumpfile:1.6.4
  elfutils:0.142
下载源码与解决依赖
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'
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
### 报出问题
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/
### 使用“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时运行时搜索的库位置。

这里我要说明一下,我指定了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 ,去研究源代码
上一篇 下一篇

猜你喜欢

热点阅读