FreeBSD 10.3에는 2개의 libelf.h /usr/include/libelf.h
와 /usr/local/include/libelf/libelf.h
.가 있으며 정의가 다릅니다 enum Elf_Cmd
.
/usr/include/libdwarf.h
또한 2개의 libdwarf.h 와 가 있습니다 /usr/local/include/libdwarf.h
. 그리고 그들은 서로 다른 정의를 가지고 있습니다 dwarf_init()
.
왜? 차이점은 무엇입니까? 어느 것을 사용해야 합니까?
===업데이트===
forqua 덕분에 이제 이름이 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를 통해 non-system-lib를 설치하고 이를 사용해야 합니다.
2 개가 있습니다 libelf
. system-lib를 사용해야 하는데 pkg를 통해 non-system-lib를 설치할 수 없습니다.
답변1
/usr/include/libelf.h
FreeBSD에 있는 버전은 /usr/local/include/libelf/libelf.h
사용자/시스템 관리자에 의해 설치되었으며, 대부분 다른 패키지의 종속성의 일부일 가능성이 높습니다. 기본에 포함된 버전이 올바른 버전이 아니거나 설치된 버전이 다음 버전일 수 있습니다. 전혀 다른 소스.
이들 중 무엇이든 사용할 수 있지만, 이것이 없는 시스템으로 이동하는 경우 /usr/local/include/libelf/libelf.h
포트나 pkg
.