6.18. Binutils-2.34

Binutils 패키지는 링커, 어셈블러 및 객체 파일을 처리하기 위한 기타 도구를 포함한다.

예상 빌드 시간: 6.7 SBU
필요 디스크 공간: 5.1 GB

6.18.1. Binutils 설치

단순 테스트를 수행하여 PTY가 chroot 환경 내에서 올바르게 작동하는지 확인하라:

expect -c "spawn ls"

이 명령은 다음을 출력해야 한다:

spawn ls

만약 출력에 위의 결과 대신 아래 메시지가 포함된 경우, PTY의 올바른 작동을 위한 환경이 설정되지 않은 것이다. 이 문제는 Binutils 및 GCC에 대한 테스트 스위트를 실행하기 전에 해결해야 한다:

The system has no more ptys.
Ask your system administrator to create more.

이제 테스트를 완료하지 못하게 하는 테스트 하나를 제거하라:

sed -i '/@\tincremental_copy/d' gold/testsuite/Makefile.in

Binutils 문서에서는 전용 빌드 디렉토리에서 Binutils를 빌드할 것을 권장한다:

mkdir -v build
cd       build

Binutils 컴파일을 준비한다:

../configure --prefix=/usr       \
             --enable-gold       \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --enable-64-bit-bfd \
             --with-system-zlib

Configure 매개변수들의 의미:

--enable-gold

gold 링커를 빌드하고 ld.gold(기본 링커와 함께)로 설치한다.

--enable-ld=default

오리지널 bfd 링커를 빌드해서 ld(기본 링커)와 ld.bfd 두 가지로 설치한다.

--enable-plugins

링커의 플러그인 지원 활성화.

--enable-64-bit-bfd

64비트 지원(워드 사이즈가 더 작은 호스트에서) 활성화. 64비트 시스템에서는 필요하지 않을 수 있지만 해를 끼치진 않는다.

--with-system-zlib

포함된 버전을 빌드하지 않고 설치된 zlib 라이브러리를 사용한다.

패키지를 컴파일한다:

make tooldir=/usr

Make 매개변수의 의미:

tooldir=/usr

일반적으로 tooldir(실행 파일이 최종적으로 위치할 디렉토리)는 $(exec_prefix)/$(target_alias)로 설정된다. 예를 들어 x86_64 시스템에서는 /usr/x86_64-unknown-linux-gnu로 나올 것이다. 이것은 커스텀 시스템이기 때문에/usr의 대상별 디렉토리는 필요하지 않다. 시스템이 크로스 컴파일(예를 들어, Intel 시스템에서 패키지를 컴파일하여 PowerPC 시스템이 실행할 코드를 생성)을 한다면 $(exec_prefix)/$(target_alias)가 쓰였을 것이다.

[중요]

중요

이 절의 Binutils 테스트 스위트는 매우 중요하다. 어떤 상황에서도 건너뛰지 않도록 하라.

결과를 테스트하라:

make -k check

ver_test_pr16504.sh 테스트는 실패하는 것으로 알려져 있다.

패키지를 설치한다:

make tooldir=/usr install

6.18.2. Binutils의 내용

설치된 프로그램들: addr2line, ar, as, c++filt, dwp, elfedit, gprof, ld, ld.bfd, ld.gold, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
설치된 라이브러리들: libbfd.{a,so}와 libopcodes.{a,so}
설치된 디렉토리: /usr/lib/ldscripts

요약

addr2line

프로그램 주소를 파일 이름 및 줄 번호로 변환; 주소와 실행 파일의 이름을 지정하면 실행 파일의 디버깅 정보를 사용하여 주소와 연결된 원본 파일 및 줄 번호를 결정

ar

아카이브에서 생성, 수정 및 추출

as

gcc의 출력을 오브젝트 파일로 조립하는 어셈블러

c++filt

링커에서 C++와 자바 심볼을 복원하고 함수들이 충돌하지 않고 오버로드되도록 유지하기 위해 사용

dwp

DWARF 패키징 유틸리티

elfedit

ELF 파일의 ELF 헤더 업데이트

gprof

호출 그래프 프로필 데이터 표시

ld

여러 오브젝트 파일과 아카이브 파일을 단일 파일로 조합해서 데이터를 재배치하고 심볼 참조를 연결하는 링커

ld.gold

elf 오브젝트 파일 포맷만 지원하는 ld의 축소 버전

ld.bfd

ld로의 하드 링크

nm

지정된 오브젝트 파일에서 나오는 심볼들을 나열

objcopy

오브젝트 파일의 한 유형을 다른 형식으로 변환

objdump

표시할 특정 정보를 제어하는 옵션과 함께, 지정된 오브젝트 파일에 대한 정보를 표시한다. 표시된 정보는 컴파일 도구를 사용하는 프로그래머에게 유용하다.

ranlib

아카이브의 내용의 색인을 생성해서 아카이브에 저장; 색인은 재배치 가능한 오브젝트 파일들로 이뤄진 아카이브 멤버에 의해 정의된 모든 심볼들을 나열한다.

readelf

ELF 유형 바이너리 파일에 대한 정보 표시

size

지정된 오브젝트 파일들의 섹션 크기 및 총 크기 나열

strings

각 지정된 파일에 대해 지정된 길이(기본값은 4개) 이상의 인쇄 가능한 문자열을 출력한다; 오브젝트 파일의 경우 기본적으로 초기화 및 로드 섹션의 문자열만 출력하고, 다른 파일 형식은 전체 파일을 조사한다

strip

오브젝트 파일에서 심볼 삭제

libbfd

바이너리 파일 디스크립터 라이브러리

libctf

ANSI-C 유형 디버깅 지원 라이브러리

libctf-nobfd

libbfd 기능을 사용하지 않는 libctf 변형

libopcodes

opcode들을 처리하기 위한 라이브러리—프로세서 명령어의 읽을 수 있는 텍스트 버전; objdump와 같은 유틸리티 빌드에 사용된다