2011-11-04 2 views
6

저는 Linux 프로그래밍을 처음 사용하고 BFD 라이브러리를 사용하려고합니다. 컴파일 나는 다음과 같은 명령 줄을 사용하고Linux에서 bfd.h를 사용하여 컴파일 오류

#include <bfd.h> 
#include <stdlib.h> 

bfd *abfd; 

int main() { 
    bfd_init(); 
    abfd = bfd_openr("/home/mike/Desktop/testFunc/testProg", NULL); 
    return 0; 
} 

을 :

gcc readInfo.c /usr/lib/libbfd.a -o readInfo 

을 그리고 다음과 같은 오류가 점점 오전 : 이것은 현재 코드는 내가 컴파일하는 것을 시도하고있다

GCC를 readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o) : 함수 내에 있음 elf_link_add_object_symbols': /build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4605: undefined reference to objalloc_free_block ' /build/build d/binutils-2.21.53.20110810/builddir-single/bfd /../../ bfd/elflink.c : 4892 : 정의되지 않은 참조 _sch_istable' /usr/lib/libbfd.a(elflink.o): In function bfd_elf_size_dynamic_sections ': /build/buildd/binutils-2.21.53.20110810/builddir- 단일/BFD /../../ BFD/elflink.c : 6048 : * [모든] 오류가 1

: 신분증 1 종료를 상태 메이크업을 반환 정의되지 않은 참조 _sch_istable 'collect2 lbasename' undefined reference tohere을 볼 수있는 더 많은 오류 라인이 있습니다. 나는 이것에 대한 간단한 설명이있을 것이라고 확신하지만, 그것은 나를 당황하게했다.

내가 지금까지 무엇을했는지 요약하면 : 우분투의

  • 설치된 정리 빌드를
  • 설치된 바이너리 유틸리티 - dev에 패키지

답변

3

정적으로 프로그램을 연결해야합니까?

그것은 컴파일 및 동적 대신 연결하면 오류없이 실행

: 나는 새로운 문제로 실행했습니다

gcc readInfo.c -o readInfo -lbfd 

이 정적으로 링크 만들려고 할 때 :

$ gcc readInfo.c /usr/lib/libbfd.a /usr/lib/x86_64-linux-gnu/libc.a -o readInfo 
/usr/bin/ld.bfd.real: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality 
    in `/usr/lib/x86_64-linux-gnu/libc.a(strcmp.o)' can not be used when making 
    an executable; recompile with -fPIE and relink with -pie 
collect2: ld returned 1 exit status 
$ gcc -fPIE readInfo.c /usr/lib/libbfd.a /usr/lib/x86_64-linux-gnu/libc.a \ 
    -o readInfo 
/usr/bin/ld.bfd.real: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality 
    in `/usr/lib/x86_64-linux-gnu/libc.a(strcmp.o)' can not be used when making 
    an executable; recompile with -fPIE and relink with -pie 
collect2: ld returned 1 exit status 
$ gcc -fPIE -pie readInfo.c /usr/lib/libbfd.a /usr/lib/x86_64-linux-gnu/libc.a \ 
    -o readInfo 
/usr/bin/ld.bfd.real: /usr/lib/libbfd.a(opncls.o): relocation R_X86_64_32S 
    against `.rodata' can not be used when making a shared object; recompile with 
    -fPIC 
/usr/lib/libbfd.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 
$ gcc -fPIC -fPIE -pie readInfo.c /usr/lib/libbfd.a \ 
    /usr/lib/x86_64-linux-gnu/libc.a -o readInfo 
/usr/bin/ld.bfd.real: /usr/lib/libbfd.a(opncls.o): relocation R_X86_64_32S 
    against `.rodata' can not be used when making a shared object; recompile with 
    -fPIC 
/usr/lib/libbfd.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 
+0

를 설치 사용하는 경우 내가 무엇을하고 있었는지 정적으로 연결하는 것을 몰랐어요. 정적으로 링크하는 것이 이러한 오류를 일으키는 이유는 무엇입니까? –

+0

'/ usr/lib/libbfd.so'는 그 기능의 일부로 다른 동적 라이브러리에 의존합니다. 따라서 정적 인 .a 버전은 최종 실행 파일을 링크 할 때 다른 정적 라이브러리를 필요로합니다. 정적으로 빌드하는 방법을 알아내는 데 문제가 있습니다. – sarnold

+0

좋아. 그것이 바로 문제를 해결하기 때문에이 대답을 받아들이려고하지만 만약 당신이 결국 너무 정확하게 정적으로 컴파일하는 방법을 발견하면 당신은 매우 감사 할거야 :) –

2

의 gcc -v를 main.c -o blah /usr/lib64/libbfd.a /usr/lib64/libiberty.a -ldl -lz

libbfd에 libiberty, dl 및 z의 기능이 필요합니다. opensuse에서이 기능을 사용할 수 있습니다. 13.1 x86_64 today with simi lar 사소한 테스트 app.

1

당신이 우분투의 binutils-DEV

sudo apt-get install binutils-dev