在 FreeBSD 10.3 中有 2 个 libelf.h/usr/include/libelf.h
和/usr/local/include/libelf/libelf.h
.而且它们有不同的定义,例如enum Elf_Cmd
。
另外还有 2 个 libdwarf.h/usr/include/libdwarf.h
和/usr/local/include/libdwarf.h
.而且它们有不同的定义,例如dwarf_init()
。
为什么?有什么不同?我应该使用哪一个?
===更新===
感谢 forquare,现在我知道有 2 个库都名为libelf
.我已经尝试过了,它们都有效。但是我仍然有问题libdwarf
。
代码:
#include <stdio.h>
#include <fcntl.h>
#include <libdwarf.h>
int main()
{
int fd = open("memleax", O_RDONLY);
Dwarf_Debug dbg;
Dwarf_Error error;
#if USR_LOCAL
int res = dwarf_init(fd, DW_DLC_READ, 0, 0, &dbg, &error);
if(res != DW_DLV_OK) {
printf("dwarf_init error: %s\n", dwarf_errmsg(error));
return -1;
}
#else
int res = dwarf_init(fd, DW_DLC_READ, &dbg, &error);
if(res != DW_DLV_OK) {
printf("dwarf_init error: %s\n", dwarf_errmsg(&error));
return -1;
}
#endif
如果使用系统库:
cc debugline.c -o debugline -lelf -ldwarf
它出错了:
dwarf_init error: ELF error : I/O error [dwarf_init(738)]
如果使用 usr-local-lib:
cc -D USR_LOCAL -I /usr/local/include/ debugline.c -o debugline -L /usr/local/lib/ -lelf -ldwarf
它出错了:
dwarf_init error: DW_DLE_ELF_BEGIN_ERROR 27 a call to elf_begin(... ELF_C_READ_MMAP... ) failed
我应该如何使用libdwarf
?
===更新
好的,我知道....
有2个libdwarf
。我应该忽略system-lib,并通过pkg安装非system-lib,并使用它。
有2个libelf
。我应该使用system-lib,并且无法通过pkg安装非system-lib。
答案1
/usr/include/libelf.h
位于 FreeBSD 中的版本/usr/local/include/libelf/libelf.h
已由您/系统管理员安装,很可能作为另一个软件包的依赖项的一部分 - 可能包含在 base 中的版本不是正确的版本,或者安装的版本可能来自完全不同的来源。
您可以使用其中任何一个,但如果您转移到没有的系统,/usr/local/include/libelf/libelf.h
则需要通过端口或pkg
.