Go to the first, previous, next, last section, table of contents.


실행 (Invocation)

GNU 링커 ld는 넓은 범위의 상황들을 대처할 수 있도록, 다른 링커들과 가능한한 호환되도록, 고안되었다. 그 결과로 여러분은 그것의 행동 제어에 대해 많은 선택권을 가진다.

명령행 옵션들(Command Line Options)

링커는 수많은 명령행 옵션들을 지원한다. 그러나 실제로 이들 중 소수만이 사용된다. 예를 들어서 ld는 표준, 지원 유닉스 시스템 상에서 표준 유닉스 오브젝트 파일들을 링크할 때 가장 빈번하게 사용된다. 그런 시스템에서 hello.o 파일을 링크하기 위해서는 다음과 같이 한다:

ld -o output /lib/crt0.o hello.o -lc

이것은 ld에게 output라는 이름의 파일을 /lib/crt0.o에다 hello.o과 표준 검색 디렉토리에서 찾아져 오는 라이브러리 libc.a를 링크한 결과로써, 생성하도록 한다. (`-l'옵션에 대한 설명은 아래를 참조.)

ld에 대한 명령행 옵션들은 임의의 순서로 지정될 수 있고 마음대로 반복될 수도 있다. (그러나) 대부분의 옵션들을 서로 다른 매개변수로 반복하는 것은 더이상 효력을 발휘 못하거나 앞에 나온 옵션을 오버라이드한다. 한번 이상 지정될 수 옵션들은 아래에서 언급한다.

옵션이 없는 매개변숟르은 서로 링크될 오브젝트 파일들이다. 그들은 명령행 옵션들과 서로 섞이거나 앞서거나 뒷서거나 할 수 있다. 단, 오브젝트 파일은 하나의 옵션과 이것의 매개변수 사이에 들어갈 수는 없다.

보통 링커는 적어도 하나의 오브젝트 파일을 받아 실행되지만 `-l', `-R', 그리고 스크립트 명령 언어를 사용해서 다른 형태의 바이너리 입력 파일들을 지정할 수 있다. 바이너리 입력 파일들을 전혀 사용하지 않는다면 링커는 어떤 결과물도 생산하지 않고 `No input files'라는 메시지를 출력한다.

링커가 오브젝트 파일의 포멧을 인식할 수 없다면 그것이 링커의 스크립트일 것이라고 가정한다. 이런식으로 지정된 스크립트 링크를 위해서 사용된느 주(主) 링커 스크립트(디폴트 링커 스크립트나 `-T'를 사용해서 지정된 것)을 확장한다. 이런 기능은 링커가 오브젝트나 아카이브로 나타난 파일에 대해서는 링크를 허용하지만 실제로 어떤 심벌 값들을 단지 정의하거나 또는 INPUT이나 GROUP을 써서 다른 오브젝트들을 로드하는 것을 허용한다. 이런식으로 스크립트를 지정하는 것은 주 링커 스크립트를 확장하는 데에만 사용되어야 한다는 것을 주의하자; 논리적으로 한번만 나타날 수 있는, SECTIONS 또는 MEMORY와 같은, 어떤 명령을 사용하기를 원한다면 여러분은 디폴트 링커 스크립트를 `-T' 옵션을 사용해서 변경해야 한다. See section 명령 언어(Command Language).

어떤 옵션의 이름이 단일 문자인 옵션이라면, 옵션 매개변수들을 그 옵션 문자뒤에 공백문자 없이 붙이거나 아니면 그들을 요구하는 옵션 바로 뒤에 오는 분리된 매개변수들로써 주어져야 한다.

여러 문자들로 이루어진 옵션들이라면, 대쉬 하나 또는 두개가 그 옵션 이름 앞에 올 수 있다; 예를 들어서 `--oformat'`--oformat'은 서로 동일하다(1). 여러 문자로 된 옵션에 대한 매개변수들은 그 옵션 이름 사이에 등호를 하나 넣든지 아니면 그들을 요구하는 옵션 바로 뒤에 오는 분리된 매개변수들로써 주어져야 한다. 예를 들어서 `--oformat srec'`--oformat=srec' 는 서로 동일하다. 여러 문자로 된 옵션의 이름에 대한 유일한 단축 표현(abbreviation)이 허용된다.

-akeyword
이 옵션은 HP/UX 호환을 위해서 지원된다. keyword 매개변수는 반드시 `archive', `shared', 또는 `default'들 중 하나이어야 한다. `-aarchive'는 기능적으로 `-Bstatic'와 동일하고 다른 두 키워드들은 기능적으로 `-Bdynamic'과 동일하다. 이 옵션은 아주 많이 사용된다.
-Aarchitecture
--architecture=architecture
ld 의 현재 릴리즈에서 이 옵션은 Intel 960 계열 아키텍쳐에 대해서만 유용하다. 그런 ld 환경에서 architecture 매개변수는 960 계열의 특정 아키텍쳐를 지정하여 아카이브-라이브러리 검색 경로를 변경하거나 보호하는 것을 가능하게 한다. 자세한 것은 See section ld와 인텔 960계열 칩(ld and the Intel 960 family). ld 의 차세대 릴리즈는 다른 아키텍쳐 계열에 대해서 비슷한 기능을 지원한다.
-b input-format
--format=input-format
ld 는 여러 종류의 오브젝트 파일을 지원하도록 설정될 수 있다. 여러분의 ld 가 이렇게 설정되었다면 명령행에서 `-b' 옵션을 써서, 이 옵션 뒤에다 입력 오브젝트 파일들에 대한 바이너리 포멧을 지정할 수 있다. (그러나) ld 가 다른 대체 오브젝트 포멧들을 지원하도록 설정되었을 때에도, ld 는 각 기계의 가장 일반적인 포멧을 디폴트 입력 포멧으로 생각하도록 설정되어야 하기 때문에, 보통 이렇게 지정할 필요가 없다. input-format 은 텍스트 문자열이며 BFD 라이브러리들에 의해서 지원되는 특정 포멧의 이름이다. (사용가능한 바이너리 포멧들을 `objdump -i' 로 출력해볼 수 있다.) See section BFD. 일상적이지 않는 바이너리 포멧으로 파일들을 링크할 때 이 옵션을 사용하고자 한다. 또는 `-b' 를 사용해서, 특정 포멧의 오브젝트 파일 그룹 앞에 `-b input-format' 를 포함함으로써, 포멧을 명시적으로 바꿀 수 있다(다른 포멧의 오브젝트 파일들을 링크할 때). 디폴트 포멧은 환경변수 GNUTARGET 를 참조해서 결정된다. See section 환경 변수(Environment Variables). 또는 입력 포멧을 스크립트에서 명령 TARGET 를 사용하여 스크립트로부터 정의할 수 있다; see section 옵션 명령(Option Commands).
-c MRI-commandfile
--mri-script=MRI-commandfile
MRI 에 의해서 생성된 링커들과의 호환성을 위해서 ld 는 section MRI 호환 스크립트 파일(MRI Compatible Script Files) 에 기술된 대체의, 제한된 명령 언어로 작성된 스크립트 파일들을 받아들인다. MRI 스크립트 파일들을 `-c' 옵션으로 지정한다; `-T' 옵션을 써서 범용 ld 스크립팅 언어로 작성된 링커 스크립트를 실행한다. MRI-cmdfile 이 존재하지 않으면 ld`-L' 옵션들에 의해서 지정된 디렉토리들 안에서 그것을 찾는다.
-d
-dc
-dp
이 세 옵션들은 모두 동일하다; 여러 형들이 있는 것은 다른 링커들과의 호환성을 위해서이다. 그들은 재할당 가능한 결과 파일이 지정되었다(`-r' 로)고 하더라도 공통 심벌들을 위한 공간을 할당한다. 스크립트 명령 FORCE_COMMON_ALLOCATION 은 동일한 효력을 가진다. See section 옵션 명령(Option Commands).
-e entry
--entry=entry
entry 를, 디폴트 엔트리 포인트 대신에, 여러분의 프로그램의 실행 실작을 위한 명시적 심벌로 사용하도록 한다. 디폴트에 대한 논의와 엔트리 포인트를 지정하는 다른 방법들에 대해서는 See section 엔트리 포인트(The Entry Point).
-E
--export-dynamic
동적으로 링크된 실행파일을 생성할 때, 모든 심벌들을 동적 심벌 테이블에 더하도록 한다. 동적 심벌 테이블은 실행시 동적 오브젝트들로부터 보이는 심벌들의 모임이다. 이 옵션을 사용하지 않으면 동적 심벌 테이블은 링크에서 언급된 어떤 동적 오브젝트에 의해서 표현된 심벌들만을 포함한다. 어떤 다른 동적 오브젝트가 아니라, 프로그램에 의해서 정의된 심벌들을 참조하는 데 필요한 동적 오브젝트를 로드하기 위해서 dlopen 을 사용하면, 프로그램 자신을 링크할 때 아마도 이 옵션을 사용해야 할 필요가 생긴다.
-f
--auxiliary name
ELF 공유 오브젝트를 생성할 때 내부 DT_AUXILARY 필드를 지정된 이름으로 설정한다. 이것은 동적 링커에게 공유 오브젝트의 심벌 테이블이 공유 오브젝트 name의 심벌 테이블의 보조 필터로 사용되어야 한다는 것을 지시한다. 이 필터 오브젝트을 프로그램에 링크한다면, 그 프로그램을 실행할 때, 동적 링커는 DT_AUXILIARY 필드를 보게 될 것이다. 동적 링커가 필터 오브젝트로부터 임의의 심벌을 해독(resolve)할 때, 먼저 공유 오브젝트 name에 정의가 있는지 없는지 검사할 것이다. 있다면 필터 오브젝트에 있는 정의 대신에 사용될 것이다. 공유 오브젝트 name이 존재해야할 필요는 없다. 그래서 공유 오브젝트 name은 어떤 함수들의 대체 구현물들을 제공하는 데 사용될 수도 있다. 예를 들어서 디버깅이나 기계 종속적인 퍼포먼스를 위해서. 이 옵션은 한번 이상 지정될 수 있다. DT_AUXILIARY 항목들은 그들이 명령행에 나타난 순서대로 생성될 것이다.
-F name
--filter name
ELF 공유 오브젝트를 생성할 때 내부 DT_FILTER 필드를 지정된 이름으로 설정한다. 이것은 동적 링커에게 현재 생성되고 있는 공유 오브젝트의 심벌 테이블이 공유 오브젝트 name의 심벌 테이블의 필터로 사용되어야 한다는 것을 지시한다. 나중에 이 필터 오브젝트를 어떤 프로그램에 링크한다면, 그 프로그램을 실행할 때 동적 링커는 DT_FILTER 필드를 볼 것이다. 동적 링커는 보통 때처럼 필터 오브젝트의 심벌 테이블에 따라서 심벌들을 해독(resolve)할 것이다. 그러나 실제로는 공유 오브젝트 name에 있는 정의들에 링크할 것이다. 그래서 필터 오브젝트는 오브젝트 name에 의해서 제공되는 심벌들의 부분 집합을 선택하는 데 사용될 수 있다. 어떤 오래된 링커들은 -F 옵션을, 컴파일 툴 체인(compilation tool chain)에서 입/출력 오브젝트 파일들에 대한 오브젝트-파일 포멧을 지정하는 데 사용했었다. GNU 링커는 이런 목적에 대해서 다른 메카니즘들을 사용한다: -b, --format, --oformat) 옵션들, 링커 스크립트안에서는 TARGET 명령, 그리고 환경 변수에서는 {GNUTARGET. GNU 링커는 ELF 공유 오브젝트를 생성하지 않는다면 -F 옵션을 무시할 것이다.
--force-exe-suffix
결과 파일이 .exe 접미사를 가지도록 한다. 성공적으로 빌드된, 완전하게 링크된 결과 파일이 .exe 또는 .dll 확장자를 가지지 않는다면 이 옵션은 링커가 결과 파일을 .exe 확장자를 가지는 동일한 이름의 파일로 복사하도록 한다. 이 옵션은 마이크로소프트 윈도우즈 호스트에서 변경되지 않은 유닉스 makefile들을 사용할 때 유용하다. 왜냐면 몇가지 버전의 윈도우즈들은 확장자가 .exe로 끝나지 않으면 이미지를 실행하지 않기 때문이다.
-g
무시된다. 그러나 다른 툴들과의 호환성 때문에 제공된다.
-Gvalue
--gpsize=value
오브젝트의 최대 크기를 GP 레지스터를 사용하여 size가 되도록 최적화시킨다. 이것은 크고 작은 오브젝트들을 다른 섹션들에 넣는 것을 지원하는 MIPS ECOFF와 같은 오브젝트 파일 포멧에 대해서만 의미가 있다.
-hname
-soname=name
ELF 공유 오브젝트를 만들 때, 내부 DT_SONAME 필드를 지정된 이름으로 설정한다. 실행 파일이 DT_SONAME 필드를 가지는 공유 오브젝트와 링크되었다면, 그 실행파일이 실행될 때 동적 링커는 링커에게 주어진 파일 이름을 사용하기 보다는 DT_SONAME에 의해서 지정된 공유 오브젝트를 로드하려고 시도할 것이다.
-i
점진적 링크를 수행한다(`-r' 옵션과 동일).
-larchive
--library=archive
아카이브 파일 archive를 링크할 파일 리스트에 추가한다. 이 옵션은 여러번 사용될 수 있다. ld는 지정된 모든 archive에 대해서 libarchive.a의 찾아 자신의 경로-리스트를 검색할 것이다. 공유 라이브러리를 지원하는 시스템들에 대해서 ld.a와 다른 확장자를 가지는 라이브러리들도 함께 찾을 것이다. 특별히 ELF와 SunOS 시스템에서는 .a 확장자를 가지는 라이브러리를 찾기 전에, ld.so 확장자를 가지는 라이브러리를 찾아서 디렉터리를 검색할 것이다. 편의상 .so 확장자는 공유 라이브러리를 나타낸다. 링커는 명령행에서 주어진 위치에서, 아카이브를 한번 찾을 것이다. 그 아카이브가 명령행에서 아카이브 이전에 나타난 어떤 오브젝트에서 정의되지 않은 심벌을 정의하였다면 링커는 그 아카이브로부터 적절한 파일(들)을 포함할 것이다. 그러나 명령행에서 나중에 나타난 오브젝트에서 정의되지 않은 심벌은 링커가 아카이브를 다시 검색하도록 하지 않을 것이다. 링커가 아카이브들을 여러번 검색하도록 시키는 방법에 대해서는 -( 옵션을 보도록 하자. 여러분은 명령행에서 동일한 아카이브를 여러번 써도 된다. 이 아카이브 검색 타입은 유닉스 링커들에게 표준이다. 그러나 AIX에서 ld를 사용하고 있다면 이것은 AIX 링커의 행동과 다르다는 것에 주목하자.
-Lsearchdir
--library-path=searchdir
경로 searchdirld가 아카이브 라이브러리들과 ld 제어 스크립트들을 찾는 경로 리스트에다 추가한다. 여러분은 이 옵션을 여러번 사용할 수 있다. 디렉터리들은 그들이 명령행에 지정된 순서대로 검색된다. 명령행에서 지정된 디렉터리들은 디폴트 디렉터리들 전에 검색된다. 모든 -L 옵션들은, 옵션들이 나타난 순서와 상관없이, 모든 -l 옵션들에 적용된다. 검색되는 디폴트 경로들(`-L'로 지정된 것들 제외)은 어떤 에뮬레이션 모드 ld가 사용되고 있는가, 어떤 경우에는 어떻게 그것이 설정되었는가에 따라서 다르다. See section 환경 변수(Environment Variables). 경로들은 SEARCH_DIR 명령으로 링크 스크립트에서 지정될 수도 있다. 이런 식으로 지정된 디렉터리들은 링커 스크립트가 명령행에서 나타난 위치에서 검색된다.
-memulation
emulation 링커를 에뮬레이트한다. 가능한 에뮬레이션은 `--verbose'`-V' 옵션들로 알아 볼 수 있다. `-m' 옵션이 사용되지 않으면 에뮬레이션은, LDEMULATION 환경 변수가 지정되어 있을 때, 이것을 사용한다. 그렇지도 않다면 디폴트 에뮬레이션은 링커가 어떻게 설정되었는가에 따라 다르다.
-M
--print-map
링크 맵을 표준 출력으로 출력한다. 링크 맵은 링크에 대한 정보와 다음과 같은 정보들을 제공한다:
-n
--nmagic
text 세그먼트를 read only로 설정하고 출력을 가능하다면 NMAGIC로 마킹힌다.
-N
--omagic
text 및 data 섹션들이 읽기 및 쓰기 가능하도록 설정한다. 또한 data 세그먼트를 페이지-정렬(page-align)하지 않는다. 출력 포멧이 유닉스 스타일 매직 넘버들을 지원한다면 출력에 OMAGIC로 마킹한다.
-o output
--output=output
outputld로 만들어진 프로그램에 대한 이름으로 사용한다; 이 옵션이 지정되지 않으면 `a.out'가 디폴트로 사용된다. 스크립트 명령 OUTPUT이 또한 출력 파일 이름을 지정할 수 있다.
-r
--relocateable
재할당가능한 출력을 생성한다---즉, ld에 대한 입력이 될 수 있는 출력 파일을 생성한다. 이것은 종종 partial linking이라고 불린다. 부작용으로써 표준 유닉스 매직 넘버들을 지원하는 환경에서, 이 옵션은 또한 출력 파일의 매직 넘버를 OMAGIC로 설정한다. 이 옵션이 지정되지 않으면 절대 파일(absolute file)이 생성된다. C++ 프로그램들을 링크할 때 이 옵션은 생성자(constructor)들에 대한 참조를 해독(resolve) 하지 않을 것이다; 이렇게 하기 위해서는 `-Ur'를 사용하라. 이 옵션은 `-i'과 동일한 일을 한다.
-R filename
--just-symbols=filename
심벌 이름들과 그들의 주소들을 filename으로부터 읽는다. 그러나 그것을 재할당하지 않는다. 즉 출력에 포함하지 않는다. 이것은 여러분의 출력 파일이, 다른 프로그램들에서 정의된 메모리의 절대적인 위치에 심볼로써(symbolically) 참조하도록 한다. 여러분은 이 옵션을 여러번 사용할 수 있다. 다른 ELF 링커들과의 호환성 때문에 -R 옵션이 파일 이름이 아니라, 디렉터리 이름뒤에 있다면 이것은 -rpath 옵션처럼 취급된다.
-s
--strip-all
모든 심벌 정보를 출력 파일에서 뺀다.
-S
--strip-debug
출력 파일로부터 디버거 심벌 정보를 뺀다(그러나 모든 심벌을 빼는 것은 아니다).
-t
--trace
입력 파일들의 이름을 ld가 그들을 처리할 때 출력한다.
-T commandfile
--script=commandfile
링크 명령들을 commandfile 파일로부터 읽는다. 이 명령들은 ld 디폴트 링크 스크립트를 교체(더하는 것이 아니라)하기 때문에 commandfile은 반드시 타겟 포멧을 기술하는 데 필요한 모든 것을 지정해야 한다. 여러분이 SECTIONS 또는 MEMORY 명령과 같은, 링커 스크립트에서 한번만 나올 수 있는 명령을 사용하고자 한다면 이 옵션을 반드시 사용해야 한다. See section 명령 언어(Command Language). commandfile 이 존재하지 않는다면 ld는 이전 `-L' 옵션들에 의해서 지정된 디렉터리들 안에서 이것을 찾는다. 여러 `-T' 옵션들이 쌓인다.
-u symbol
--undefined=symbol
symbol이 출력 파일에 정의되지 않은 심벌로써 들어가도록 한다. 이렇게 하는 것은, 예를 들어서, 추가의 모듈들이 표준 라이브러리들과 링크되도록 촉발시킨다. `-u'는 추가의 정의되지 않는 심벌들을 넣기 위해서 다른 옵션 매개변수들을 가진 것들로 여러번 반복될 수 있다.
-v
--version
-V
ld의 버전 번호를 디스플레이한다. -V 옵션은 또한 지원된 에뮬레이션들 리스트를 나타낸다.
-x
--discard-all
모든 로컬 심벌들을 삭제한다.
-X
--discard-locals
모든 임시 로컬 심벌들을 삭제한다. 대부분의 타겟들에 대해서 이것은 모두, 이름이 `L'로 시작하는 로컬 심벌들이다.
-y symbol
--trace-symbol=symbol
symbol이 나타나는 링크된 파일 각각의 이름을 출력한다. 이 옵션은 여러번 주어질 수 있다. 많은 시스템에서 밑줄(underscore)을 앞에 달고(prepend) 있어야 한다. 이 옵션은 링크에 정의되지 않은 심벌을 갖고 있지만 그 레퍼런스가 어디로부터 오는지 모를 때 유용하다.
-Y path
path를 디폴트 라이브러리 검색 경로에 추가한다. 이 옵션은 솔라리스 호환성을 위해서 존재한다.
-z keyword
이 옵션은 솔라리스 호환성을 위해서 무시된다.
-( archives -)
--start-group archives --end-group
archives는 반드시 아키이브 파일들이어야 한다. 이들은 파일 이름이 있는 그대로 명시된 것일 수 있거나 아니면 `-l' 옵션들일 수 있다. 지정된 아카이브들은 새로운 정의되지 않은 참조들이 생성되지(나타나지) 않을 때까지 검색될 것이다. 일반적으로 아카이브는 명령행에서 지정된 순서로 단한번 검색된다. 그 아카이브 안에 있는 기호가 명령 라인에서 나중에 나타난 아카이브의 오브젝트에 의해서 참조된 미정의 기호를 해결하기 위해서 필요하다면 링커는 그 참조를 해결하지 못할 것이다. 아카이브를 그룹핑해서 그들이 모든 가능한 레퍼런스들이 해결될 때까지 반복해서 검색한다. 이 옵션을 사용하는 것은 상당한 성능 비용이 든다. 이것은 두개 또는 그 이상의 아카이브들 간에 피할 수 없는 순환 참조가 있을 때만 사용하는 것이 가장 최선이다.
-assert keyword
이 옵션은 SunOS 호환성을 위해서 무시된다.
-Bdynamic
-dy
-call_shared
동적 라이브러리들을 링크한다. 이것은 공유 라이브러리들이 지원되는 플랫폼들에서만 의미가 있다. 이 옵션은 그런 플랫폼들에서 일반적으로 디폴트이다. 이 옵션의 다른 변종들이 다양한 시스템들과의 호환성을 위해서 존재한다. 여러분은 명령행 라인에서 이옵션을 여러번 사용할 수 있다: 이것 뒤에 오는 -l 옵션들에 대한 라이브러리 검색에 영향을 미친다.
-Bstatic
-dn
-non_shared
-static
공유 라이브러리들을 링크하지 않도록 한다. 이것은 공유 라이브러리들이 지원되는 플랫폼들에서만 의미가 있다. 이 옵션의 다른 변종들이 여러 시스템들의 호환성을 위해서 있다. 여러분은 명령행에서 이 옵션을 여러번 사용할 수 있다: 이 뒤에 오는 -l 옵션들에 대한 라이브러리 검색에 영향을 미친다.
-Bsymbolic
공유 라이브러리를 생성할 때 글로벌 심벌들에 대한 참조들을 (존재한다면) 공유 라이브러리 안에 있는 정의와 묶는다. 일반적으로 프로그램이 공유 라이브러리 안에 있는 정의를 링크하는 것이 가능하다. 이 옵션은 공유 라이브러리를 지원하는 ELF 플랫폼에서만 의미가 있다.
--cref
교차 참조 테이블(cross reference table)을 출력한다. 링커 맵 파일이 생성되고 있다면 교차 참조 테이블은 맵 파일에 출력된다. 그렇지 않다면 이것은 표준 출력에 출력된다. 테이블의 포멧은 고의적으로 단순하다. 그래서 필요하다면 스크립트에 의해서 쉽게 처리될 수 있다. 심벌들이 출력되고 이름으로 소팅된다. 각 심벌에 대해서 파일 이름들 리스트가 주어진다. 심벌이 정의되었다면 리스트된 첫번째 파일이 그 정의의 위치이다. 나머지 파일들은 그 심벌에 대한 참조들을 담고 있다.
--defsym symbol=expression
출력 파일에, expression에 의해서 주어진 절대 주소를 담고 있는, 글로벌 심벌을 생성한다. 여러분은 이 옵션을 명령행에서 여러 심벌들을 정의하기 위해서 필요한 만큼 사용할 수 있다. arithmetic의 제한된 형은 expression에 대해서 제공된다: 16진수 상수나 현존하는 심벌의 이름을 제공할 수도 있으며 또는 16진수 상수나 심벌들을 더하거나 빼기 위해서 +-를 사용할 수도 있다. 좀 더 정교한 표현식을 원한다면 스크립트에서 링커 명령 언어를 사용하는 것을 생각해보아라(see section 할당: 심벌 정의(Assignment: Defining Symbols)). 노트: symbol와 등호 ("="), 그리고 expression 사이에는 공백 문자가 없어야 한다.
--dynamic-linker file
동적 링커의 이름을 지정한다. 이것은 동적으로 링크된 ELF 실행 파일들을 생성하는 플랫폼에서만 의미가 있다. 디폴트 동적 링커는 일반적으로 correct이다; 이것을 여러분이 무엇을 하고 있는가를 모른다면 사용하지 말라.
-EB
big-endian 오브젝트들을 링크한다. 이것은 디폴트 출력 포멧에 영향을 미친다.
-EL
little-endian 오브젝트들을 링크한다. 이것은 디폴트 출력 포멧에 영향을 미친다.
--embedded-relocs
이 옵션은, GNU 컴파일러와 어셈블러에게 -membedded-pic 옵션을 주어 생성된, MIPS 임베디드 PIC 코드를 링크할 때만 의미가 있다. 이것은 링커가, 정적으로 포인터 값들로 초기화되었던 임의의 데이터의 위치를 실행 시간 중에 재설정(relocate)하기 위해서 사용될 수도 있는 테이블을 생성하도록 한다. 자세한 것은 testsuite/ld-empic 에 있는 코드를 참조하자.
--help
표준 출력에 명령행 옵션들의 요약을 출력하고 종료한다.
-Map mapfile
링크 맵을 mapfile에 출력한다. 위에 있는 `-M' 옵션에 대한 설명을 참조하자.
--no-keep-memory
ld는 일반적으로 입력 파일들의 심벌 테이블들을 메모리에 캐슁함으로써 (실행) 속도를 최적화한다. 이 옵션은 ld가 그대신에 필요할 때 심벌 테이블들을 다시 읽게 하여서 메모리 사용에 대해서 최적화하도록 한다. 이것은 커다란 실행 파일을 링크할 때, ld가 메모리 부족을 나타내면 필요하다.
--no-warn-mismatch
일반적으로 ld는, 서로 다른 프로세서들에 대해서 컴파일 되었거나 아니면 다른 endian을 가졌기 때문, 등의 이유로 서로 맞지 않는 입력 파일들을 서로 링크하려고 노력하면 에러를 발생할 것이다. 이 옵션은 ld가 그런 가능한 에러들을 조용하게 발생하도록 지시한다. 이 옵션은, 링커 에러들이 부적절한지 어쩐지 확인하는 몇가지 특별한 액션을 취할 때, 아주 조심스럽게 사용되어야 한다.
--no-whole-archive
후속 아카이브 파일들에 대한 --whole-archive 옵션의 효과를 끈다.
--noinhibit-exec
실행 출력 파일이 사용가능할 때마다 이것을 계속 보유한다. 일반적으로 링커는 링크 과정에서 에러를 만난다면 출력 파일을 만들지 않을 것이다; 에러가 무엇이든 이것을 발생할 때 출력 파일을 쓰지 않고 링커는 종료한다.
--oformat output-format
ld는 한 종류 이상의 오브젝트 파일을 지원하도록 설정될 것이다. ld가 이런식으로 설정되었다면 `--oformat' 옵션을 사용하여 출력 오브젝트 포멧들에 대한 바이너리 포멧을 지정할 수 있다. ld가 대체 오브젝트 포멧들을 지원하도록 설정되었다 하더라도 보통은 이것을 지정할 필요가 없다. 왜냐면 ld가 각 머쉰에서 가장 유용한 포멧으로 디폴트 출력 포멧을 생성하도록 설정되었을 것이기 때문이다. output-format는 텍스트 문자열이고 특정한 포멧의 이름은 BFD 라이브러리들에 의해서 지원된다. (여러분은 `objdump -i'를 사용해서 사용 가능한 바이너리 포멧들 리스트를 볼 수 있다.) 스크립트 명령 OUTPUT_FORMAT는 출력 포멧을 지정할 수 있지만 이 옵션은 그것을 오버라이드한다. See section BFD.
-qmagic
이 옵션은 리눅스 호환성을 위해서 무시된다.
-Qy
이 옵션은 SVR4 호환성을 위해서 무시된다.
--relax
이 옵션은 머쉰 종속적인 효과를 가진 옵션이다. 이 옵션은 몇가지 타겟들 위에서만 지원된다. See section ld 그리고 H8/300(ld and the H8/300). See section ld와 인텔 960계열 칩(ld and the Intel 960 family). 어떤 플랫폼에서 `--relax' 옵션은, address 링커가 프로그램안에서 어드레싱을 해독(resolve)할 때 가능한, 어드레스 모드들을 relax하고 출력 오브젝트 파일에서 새로운 명령어들을 합성하는 것과 같은, 글로벌 최적화를 수행한다. 이것이 지원되지 않는 플랫폼에서도 `--relax'는 받아들여지지만 무시된다.
--retain-symbols-file filename
파일 filename에 있는 심벌들 간직하고 나머지는 모두 버린다. filename는 한 라인에 한 심벌 이름을 가진 단순한 파일이다. 이 옵션은 특별히, 커다란 글로벌 심벌 테이블이 메모리를 보호하기 위해서 점차 집약되는 (VxWorks와 같은) 환경에서 유용하다. `--retain-symbols-file' 는 정의되지 않은 심벌들, 또는 재배치를 위해서 필요한 심벌들을 버리지 않는다. 여러분은 `--retain-symbols-file'을 명령행에서 한번만 지정할 수 있다. 이것은 `-s'`-S'을 오버라이드한다.
-rpath dir
디렉터리를 실시간 라이브러리 검색 경로에 추가한다. 이것은 ELF 실행 파일을 공유 오브젝트들과 링크할 때 사용된다. 모든 -rpath 매개변수들은 조합되어 실시간 링커에게 전달된다. 그러면 이것은 그들을 사용해서 실시간에 공유 오브젝트들을 찾는다. -rpath 옵션은 또한 링크에서 명시적으로 포함된 공유 오브젝트들에 의해서 필요한 공유 오브젝트들을 찾을 때도 사용된다; -rpath-link 옵션의 설명을 보자. -rpath가 ELF 실행파일을 링크할 때 사용되지 않으면 환경 변수 LD_RUN_PATH의 내용물이, 정의되었다면, 사용될 것이다. -rpath 옵션은 SunOS에서도 사용될 수 있다. 디폴트로 SunOS에서 링커는 주어진 -L 옵션들 중에서 실시간 검색 패치(patch)를 구성할 것이다. -rpath 옵션이 사용되면 실시간 검색 경로는 -rpath 옵션들을 명시적으로 사용하여 구성될 것이고 -L 옵션들을 무시할 것이다. 이것은 NFC 마운트된 파일시스템들로부터 가져온 것일 수 있는, 많은 -L 옵션들을 더하는 gcc를 사용할 때 유용할 수 있다. ELF 링커들과의 호환성을 위해서 파일 이름이 아니라, 디렉터리 이름 뒤에 따라 붙은 -R 옵션이 주어지면 이것은 -rpath 옵션으로 취급된다.
-rpath-link DIR
ELF 또는 SunOS를 사용할 때 한가지 공유 라이브러리는 다른 것을 요구할 수도 있다. 이것은 ld -shared 링크가 입력 파일들 중의 하나로써 공유 라이브러리를 포함할 때 일어난다. 링커가 비-공유, 비-재배치 링크를 수행할 때 그런 종속성을 만나면 자동으로 요구된 공유 라이브러리를 찾으려고 하고 명시적으로 포함되지 않았다면 그것을 링크에 포함시킨다. 그런 경우 -rpath-link 옵션은 검색할 첫번째 디렉터리들을 지정한다. -rpath-link 옵션은 콜론(:)으로 분리된 이름들 리스트를 지정함으로써 또는 여러번 나타남으로써 디렉터리 이름의 순서를 지정할 수도 있다. 링커는 다음과 같은 검색 경로들을 사용해서 요구된 공유 라이브러리들을 찾는다.
  1. -rpath-link 옵션들에 의해서 지정된 임의의 디렉터리들.
  2. -rpath 옵션들에 의해서 지정된 임의의 디렉터리들. -rpath-rpath-link 옵션의 차이점은 -rpath 옵션들로 지정된 디렉터리들은 실행 파일안에 포함되고 실행시에 사용되는 반면 -rpath-link 옵션은 단지 링크할 때만 영향을 미친다는 점이다.
  3. ELF 시스템에서 -rpathrpath-link 옵션들이 사용되지 않으면 환경 변수 LD_RUN_PATH의 내용들을 검색한다.
  4. SunOS에서 -rpath 옵션이 사용되지 않으면 -L 옵션들로 지정된 임의의 디렉터리들을 검색한다.
  5. 원시(native) 링커의 경우 환경 변수 LD_LIBRARY_PATH의 내용.
  6. 디폴트 디렉터리들, 일반적으로 `/lib'`/usr/lib'.
요구된 공유 라이브러리가 발견되지 않으면 링커는 경고를 발생하고 링크를 계속한다.
-shared
-Bshareable
공유 라이브러리를 생성한다. 이것은 현재 ELF, XCOFF, 그리고 SunOS 플랫폼들에서만 지원된다. SunOS에서 링커는 -e 옵션이 사용되지 않고 링크에서 정의되지 않은 심벌들이 있으면 자동으로 공유 라이브러리를 생성한다.
--sort-common
이 옵션은 ld에게 공용 심벌들을 적절한 출력 섹션들에 놓을 때 그들의 크기에 따라서 소팅하도록 지시한다. 첫번째로 모든 1 바이트 심벌들이 오고 그 다음에 모든 2 바이트 심벌들이 오고 그 다음에 4 바이트 심벌들이 오고 마지막으로 나머지 모든 것들이 온다. 이것은 배치 제약(alignment constraint)때문에 발생되는 심벌들 사이의 틈들을 막기 위한 것이다.
--split-by-file
--split-by-reloc와 비슷하지만 각 입력 파일을 위한 새로운 출력 섹션을 생성한다.
--split-by-reloc count
출력 파일에 여분의 섹션들을 만들어서 그 파일에서 어떤 단일 출력 섹션도 count 개수 이상의 재배치들을 담지 못하도록 시도한다. 이것은 어떤 COFF 오브젝트 파일 포멧을 가지는 실시간 커널안으로 다운로딩하기 위해서 커다란 재배치 가능한 것을 생성할 때 유용하다; 왜냐면 COFF는 단일 섹션안에 65535 재배치들보다 많은 것들을 표현할 수 없기 때문이다. 이것은 임의 섹션들을 지원하지 않는 오브젝트 파일 포멧들과 작업하지 못한다는 점에 주목하자. 링커는 재배포를 위해서 개별 입력 섹션들을 분할하지 않을 것이다. 그래서 단일 입력 섹션이 count 개수 재배치들보다 많은 것을 담고 있다면 단일 출력 섹션이 그 많은 재배치들을 포함할 것이다.
--stats
실행 시간과 메모리 사용과 같은 링커의 작업에 대한 통계치를 계산해서 디스플레이한다.
--traditional-format
어떤 타겟들에 대해서 ld의 출력은 현존하는 어떤 링커의 출력과 어떤 방식에서 서로 다르다. 이 옵션은 ld에게 대신에, 전통적인 포멧을 사용하도록 요구한다. 예를 들어서, SunOS에서, ld는 심벌 문자열 테이블에 있는 중복된 항목들을 서로 묶는다. 이것은 완전한 디버깅 정보를 가진 출력 파일의 크기를 30 퍼센트 이상 줄인다. 불행하게도 SunOS dbx 프로그램은 결과 프로그램(gdb 는 문제가 없다)은 이런 결과 프로그램을 읽지 못한다. `--traditional-format' 옵션은 ld가 중복된 항목들을 묶지 않도록 한다.
-Tbss org
-Tdata org
-Ttext org
org를 출력 파일의 bss, data, 또는 text 세그먼트---각각에--- 대해서 시작 주소로 사용하도록 한다. org는 반드시 16진수 정수이어야 한다; 다른 링커들과의 호환성을 위하여 여러분은 16진수 값 앞에 보통 붙이는 `0x'를 생략할 수도 있다.
-Ur
C++ 프로그램들과 다른 모든 것들에 대해서 이 옵션은 `-r'과 동일하다: 이것은 재배치 가능한 출력을 생성한다---즉, ld에 대한 입력으로 사용될 수 있는 출력 파일. C++ 프로그램들을 링크할 때 `-Ur'`-r'와는 다르게 생성자에 대한 참조들을 해독(resolve) 한다. `-Ur'로 그들 자신이 링크된 파일들에 대해서 `-Ur'를 사용하는 것은 작동하지 않는다; 일단 생성자 테이블이 만들어지면 이것은 더해질 수 없다. 마지막 부분 링크에 대해서만 `-Ur'를 사용하고 다른 것들에 대해서는 `-r'를 사용하자.
--verbose
ld에 대해서 버전 번호를 디스플레이하고 지원되는 링커 에뮬레이션들 리스트를 디스플레이한다. 어떤 입력 파일들이 오픈될 수 없는지에 대해서 디스플레이한다. 디폴트 내장 스크립트를 사용한다면, 링커 스크립트를 디스플레이한다.
--version-script=version-scriptfile
링커에 대한 버전 스크립트 이름을 지정한다. 이것은 생성되고 있는 라이브러리에 대한 버전 계층에 대한 추가 정보를 지정하기 위해서, 공유 라이브러리들을 만들 때 전형적으로 사용된다. 이 옵션은 공유 라이브러리들을 지원하는 ELF 플랫폼들에서만 의미가 있다.
--warn-common
공용 심벌이 다른 공용 심벌이나 심벌 정의와 묶일 때 경고한다. 유닉스 링커들은 이러한 너절한(sloppy) 현실을 허용하지만 다른 운영 체제의 링커들은 그렇지 않다. 이 옵션은 글로벌 심벌들로부터 잠재된 문제들을 찾도록 해준다. 불행하게도 어떤 C 라이브러리들은 이런 관행을 사용한다. 그래서 여러분은 여러분의 프로그램들에서와 마찬가지로 라이브러리들에서도 심벌들에 대한 어떤 경고들을 보게될 수도 있다. 글로벌 심벌들은, 다음에서 C 예제들로 예시한 바와 같이, 세가지 종류가 있다:
`int i = 1;'
정의. 이것은 출력 파일의 초기화된 data 섹션에 들어간다.
`extern int i;'
정의되지 않은 참조. 이것은 공간을 할당하지 않는다. 이 변수에 대한 정의나 공용 심벌이 어딘가에 반드시 있어야 한다.
`int i;'
공통 심벌. 하나의 변수에 대해서 (하나 이상의) 공통 심벌들만 존재한다면 이것은 출력 파일의 초기화되지 않은 영역에 들어 간다. 링커는 동일한 변수에 대한 다수의 공통 심벌들을 단일 심벌로 머지한다. 그들이 서로 크기가 다르다면 가장 큰 크기를 선택한다. 링커는 동일한 변수의 정의가 있으면, 공용 심벌을 선언으로 변환한다.
`--warn-common' 옵션은 다섯가지 종류의 경고들을 만들 수 있다. 각 경고는 한쌍의 라인으로 이루어져 있다: 첫번째는 방금 만난 심벌을 기술하고 두번째 라인은 동일한 이름으로 만난 이전 심벌을 기술한다. 두 심벌들 중에서 하나 또는 두개 모두는 공통 심벌일 것이다.
  1. 공통 심벌을 참조로 변환한다. 왜냐면 이미 그 심벌의 정의가 있기 때문이다.
    file(section): warning: common of `symbol'
       overridden by definition
    file(section): warning: defined here
    
  2. 공통 심벌을 참조로 변환한다. 왜냐면 그 심벌에 대한 사후(later) 정의를 만났기 때문이다. 이것은 그 심벌들이 서로 다른 순서로 만났다는 것을 제외하고는 이전 경우와 동일하다.
    file(section): warning: definition of `symbol'
       overriding common
    file(section): warning: common is here
    
  3. 공통 심벌을 이전의 동일-크기 공통 심벌로 머지한다.
    file(section): warning: multiple common
       of `symbol'
    file(section): warning: previous common is here
    
  4. 공통 심벌을 이전의 더 큰 공통 심벌로 머지한다.
    file(section): warning: common of `symbol'
       overridden by larger common
    file(section): warning: larger common is here
    
  5. 공통 심벌을 이전의 더 작은 공통 심벌로 머지한다. 이것은 이전의 경우와, 그 심벌이 다른 순서로 만난다는 것을 제외하고는, 동일하다.
    file(section): warning: common of `symbol'
       overriding smaller common
    file(section): warning: smaller common is here
    
--warn-constructors
임의의 글로벌 생성자들이 사용되면 경고한다. 이것은 몇가지 오브젝트 파일 포멧들에 대해서만 유용하다. COFF 또는 ELF와 같은 포멧들에 대해서 링커는 글로벌 생성자들 사용을 검출할 수 없다.
--warn-multiple-gp
다수의 글로벌 포인터 값들이 출력 파일에서 요구되면 경고를 낸다. 이것은 Alpha와 같은 어떤 프로세서들에게만 의미가 있다. 특별히 어떤 프로세서들은 커다란-값의 상수들을 특수한 섹션에 넣는다. 특수한 레지스터(글로벌 포인터)는 이 섹션의 일부를 가리키기 때문에 그 상수들은 base-register 상대 어드레싱 모드(relative addressing mode)를 통해서 효과적으로 로드될 수 있다. base-register 상대 모드에서 오프셋은 고정되어 있고 상대적으로 작기 때문에(즉, 16비트) 이것은 상수 풀(constant pool)의 최대 크기를 제한한다. 그래서 커다란 프로그램에서 모든 가능한 상수들을 어드레스할 수 있기 위해서 다수의 글로벌 포인터 값들을 사용하는 것이 종종 필요하다. 이 옵션은 이런 경우가 발생할 때마다 경고가 발생하도록 한다.
--warn-once
각 정의되지 않은 심벌에 대해서, 이것을 참조하는 모듈마다 한번씩 경고하는 것이 아니라, (전체적으로) 한번만 경고한다.
--warn-section-align
출력 섹션의 어드레스가 정렬(alignment) 때문에 변경되면 경고한다. 전형적으로 정렬은 입력 섹션에 의해서 설정될 것이다. 그 어드레스는 명시적으로 지정되지 않았을 경우에만 변경될 것이다; 즉 SECTIONS 명령이 그 섹션에 대한 시작 주소를 지정하지 않았을 경우에만 변경될 것이다. (see section 출력 섹션 지정(Specifying Output Sections)).
--whole-archive
명령행에서 --whole-archive 옵션 이후에 언급된 각 아카이브에 대해서, 요구된 오브젝트 파일들에 대한 아카이브를 검색하기 보다는, 그 링크 안에 아카이브에 있는 모든 오브젝트 파일을 포함한다. 이것은 일반적으로, 각 오브젝트가 결과 공유 라이러리에 꼭 포함되도록 해서, 아카이브 파일을 공유 라이브러리로 변환하는 데 사용된다. 이 옵션은 여러번 사용될 수 있다.
--wrap symbol
symbol에 대해서 랩퍼(wrapper) 함수를 사용한다. symbol에 대한 정의되지 않은 참조는 __wrap_symbol로 해독될 것이다. __real_symbol에 대한 임의의 정의되지 않은 참조는 symbol로 해독될 것이다. 이것은 시스템 함수에 대한 랩퍼를 제공하는 데 사용될 수 있다. 랩퍼 함수는 __wrap_symbol로 불리어야 한다. 시스템 함수를 호출하고자 한다면 __real_symbol를 호출해야 한다. 다음은 단순한 예제이다:
void *
__wrap_malloc (int c)
{
  printf ("malloc called with %ld\n", c);
  return __real_malloc (c);
}
다른 코드를 이 파일과 --wrap malloc를 사용해서 링크한다면 malloc에 대한 모든 호출들은 __wrap_malloc를 대신 호출할 것이다. __wrap_malloc안에 있는 __real_malloc에 대한 호출은 실제의 malloc 함수를 호출할 것이다. 여러분은 --wrap 옵션없이도 링크가 성공할 수 있도록, __real_malloc 함수도 제공하고자 원할런지 모른다. 그렇게 하면 __wrap_malloc와 같은 파일에 __real_malloc 의 정의를 넣으면 안된다; 그렇게 하면 링커가 그것을 malloc으로 랩핑하기 전에 어셈블러는 그 호출을 해독할 수도 있다.

환경 변수(Environment Variables)

GNUTARGETLDEMULATION 환경 변수들로 ld의 행동을 변경할 수 있다.

GNUTARGET는 여러분이 `-b'(또는 이것과 유사한 것 `--format')을 사용하지 않았다면 입력-파일 오브젝트를 결정한다. 이것의 값은 입력 포멧에 대한 BFD 이름들 중의 하나이어야 한다. (see section BFD). 환경에 GNUTARGET이 없으면 ld는 타겟의 일반적인(natural) 포멧을 사용한다. GNUTARGETdefault로 설정되면 BFD는 바이너리 입력 파일들을 시험함으로써 입력 포멧을 발견하려고 할 것이다; 이런 방법은 종종 성공하지만 잠재적인 모호성이 있다. 왜냐면 오브젝트-파일 포멧들이 유일하기 때문이다. 그러나 각 시스템에 있는 BFD를 위한 설정 과정이 검색-리스트에 그 시스템에 대한 전통적인 포멧을 처음에 놓는다. 그래서 모호성이 관례에 따라 해독된다.

LDEMULATION`-m' 옵션을 사용하지 않으면 디폴트 에뮬레이션을 결정한다. 에뮬레이션은 링커 행동의 다양한 면들에 영향을 미칠 수 있다. 특별히 디폴트 링커 스크립트에 영향을 미칠 수 있다. 여러분은 사용가능한 에뮬레이션 리스트를 `--verbose' 또는 `-V' 옵션들로 확인할 수 있다. `-m' 옵션이 사용되지 않았고 또한 LDEMULATION 환경 변수가 정의되지 않았다면 디폴트 에뮬레이션은 링커가 설정된 방법에 따라 달라진다.


Go to the first, previous, next, last section, table of contents.