FreeBSD 中的 2 个不同的 libelf.h 和 libdwarf.h?

FreeBSD 中的 2 个不同的 libelf.h 和 libdwarf.h?

在 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.

相关内容