2 diferente libelf.h e libdwarf.h no FreeBSD?

1

No FreeBSD 10.3 existem 2 libelf.h, /usr/include/libelf.h e /usr/local/include/libelf/libelf.h . E eles têm diferentes definições, como enum Elf_Cmd .

Além disso, há 2 libdwarf.h, /usr/include/libdwarf.h e /usr/local/include/libdwarf.h . E eles têm diferentes definições, como dwarf_init() .

Por quê? Qual é a diferença? Qual deles devo usar?

=== update ===

Obrigado pelo forquare, agora eu sei que existem duas bibliotecas chamadas libelf . Eu os experimentei e eles trabalharam nos dois. No entanto, ainda tenho problom com libdwarf .

Código:

#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

Se estiver usando system-lib:

cc  debugline.c -o debugline   -lelf -ldwarf

acontece de errado com:

dwarf_init error: ELF error : I/O error [dwarf_init(738)]

Se estiver usando usr-local-lib:

cc -D USR_LOCAL -I /usr/local/include/ debugline.c -o debugline -L /usr/local/lib/ -lelf -ldwarf

acontece de errado com:

dwarf_init error: DW_DLE_ELF_BEGIN_ERROR 27 a call to elf_begin(... ELF_C_READ_MMAP... ) failed

Como devo usar libdwarf ?

=== atualizar

Ok, eu sei ....

Existem 2 libdwarf . Eu deveria ignorar o system-lib, e instalar o não-system-lib pelo pkg, e usá-lo.

Existem 2 libelf . Eu deveria usar o system-lib, e não posso instalar o não-system-lib pelo pkg.

    
por Bingzheng Wu 29.05.2016 / 16:28

1 resposta

2

Aquele localizado em /usr/include/libelf.h está incluído no FreeBSD enquanto /usr/local/include/libelf/libelf.h foi instalado por você / o administrador do sistema mais provavelmente como parte de uma dependência para outro pacote - talvez o incluído na base não estava no correto versão, ou talvez o instalado é de uma fonte de diferença completamente.

Você também pode usar, mas se você mudar para um sistema que não tenha /usr/local/include/libelf/libelf.h , precisará instalá-lo via portas ou pkg .

    
por 29.05.2016 / 18:51