Linux / Unix 명령 : ID

이름

ld - GNU 링커 인 LD 사용하기

개요

ld [ options ] objfile ...

기술

ld 는 많은 수의 객체와 아카이브 파일을 결합하고 데이터를 재배치하여 심볼 참조를 묶습니다. 보통 프로그램을 컴파일하는 마지막 단계는 ld 를 실행하는 것입니다.

ld 는 AT & T의 링크 편집기 명령 언어 (Link Editor Command Language) 구문의 상위 집합으로 작성된 링커 명령 언어 파일을 허용하여 연결 프로세스를 명확하고 완전하게 제어합니다.

이 맨 페이지는 명령 언어를 설명하지 않습니다. 명령 언어 및 GNU 링커의 다른 측면에 대한 자세한 내용은 "info"의 ld 항목 또는 설명서 ld : GNU 링커를 참조하십시오.

이 버전의 ld 는 범용 BFD 라이브러리를 사용하여 객체 파일을 조작합니다. 이렇게하면 ld 가 여러 가지 형식 (예 : COFF 또는 "a.out")으로 오브젝트 파일을 읽고, 결합하고, 쓸 수 있습니다. 사용 가능한 종류의 오브젝트 파일을 생성하기 위해 서로 다른 형식을 함께 연결할 수 있습니다.

GNU 링커는 유연성 외에도 다른 링커보다 진단 정보를 제공하는 것이 더 유용합니다. 많은 링커가 오류가 발생하면 즉시 실행을 포기합니다. 가능한 경우 ld가 계속 실행되어 다른 오류를 식별 할 수 있습니다 (또는 경우에 따라 오류에도 불구하고 출력 파일을 가져올 수 있음).

GNU 링커 ld 는 광범위한 상황을 다루고 가능한 한 다른 링커와 호환되도록 만들어졌습니다. 결과적으로 행동을 제어 할 수있는 선택의 폭이 넓어집니다.

옵션

링커는 많은 명령 줄 옵션 을 지원하지만 실제로는 특정 상황에서 거의 사용되지 않습니다. 예를 들어, ld를 자주 사용하면 표준 Unix 오브젝트 파일을 지원되는 표준 Unix 시스템 에 연결할 수 있습니다 . 이러한 시스템에서 "hello.o"파일을 링크하려면 다음을 수행하십시오.

ld -o <출력> /lib/crt0.o hello.o -lc

이것은 ld 가 "/lib/crt0.o"파일과 "hello.o"파일을 연결하고 "libc.a"라이브러리를 표준 검색 디렉토리에서 가져온 결과로 output 이라는 파일을 생성하도록 지시합니다. (아래의 -l 옵션에 대한 설명을 참조하십시오.)

ld명령 행 옵션 중 일부는 명령 행의 어느 지점에서나 지정할 수 있습니다. 그러나 -l 또는 -T 와 같은 파일을 참조하는 옵션은 명령 행에 옵션이 나타나는 지점에서 오브젝트 파일 및 기타 파일 옵션에 상대적인 파일을 읽게합니다. 다른 인수를 사용하여 파일이 아닌 옵션을 반복하면 더 이상 효과가 없거나 이전 옵션 (명령 줄에서 왼쪽에있는 옵션)을 무시합니다. 의미가 두 번 이상 지정 될 수있는 옵션은 아래 설명에 명시되어 있습니다.

옵션이 아닌 인수는 함께 링크 될 오브젝트 파일 또는 아카이브입니다. 이들은 옵션과 인수 사이에 오브젝트 파일 인수를 두지 않을 수 있다는 점을 제외하고는 명령 행 옵션을 따르거나 선행 또는 혼합 할 수 있습니다.

일반적으로 링커는 적어도 하나의 오브젝트 파일로 호출되지만 -l , -R 및 스크립트 명령 언어를 사용하여 다른 형식의 2 진 입력 파일을 지정할 수 있습니다. 이진 입력 파일을 전혀 지정하지 않으면 링커에서 출력을 생성하지 않고 입력 파일 없음 이라는 메시지를 표시 합니다 .

링커가 객체 파일의 형식을 인식 할 수없는 경우 링커 스크립트라고 가정합니다. 이 방법으로 지정된 스크립트는 링크에 사용 된 기본 링커 스크립트 (기본 링커 스크립트 또는 -T 를 사용하여 지정된 스크립트)를 보강합니다. 이 기능을 사용하면 링커가 객체 나 아카이브처럼 보이는 파일을 링크 할 수 있지만 실제로는 일부 심볼 값을 정의하거나 "INPUT"또는 "GROUP"을 사용하여 다른 객체를로드합니다. 이 방법으로 스크립트를 지정하면 주 링커 스크립트가 보강됩니다. -T 옵션을 사용하여 기본 링커 스크립트를 완전히 바꿉니다.

이름이 단일 문자 인 옵션의 경우, 옵션 인수는 공백을 삽입하지 않고 옵션 문자 뒤에 오거나 옵션 문자 바로 뒤에 오는 별도의 인수로 제공되어야합니다.

이름이 여러 글자 인 옵션의 경우 옵션 이름 앞에 대시 또는 두 개를 사용할 수 있습니다. 예 : -trace-symbol--trace-symbol 은 동일합니다. 주 -이 규칙에는 한 가지 예외가 있습니다. 소문자 'o'로 시작하는 여러 문자 옵션은 두 개의 대시로 시작될 수 있습니다. 이것은 -o 옵션과의 혼동을 줄이기위한 것입니다. 예를 들어 -omagic 은 출력 파일 이름을 magic으로 설정하고 --omagic은 출력에 NMAGIC 플래그를 설정합니다.

복수 문자 옵션에 대한 인수는 옵션 이름과 등호로 구분하거나 매개 변수를 요구하는 옵션 바로 다음에 별도의 인수로 제공해야합니다. 예를 들어 --trace-symbol foo--trace-symbol = foo 는 동일합니다. 여러 글자 옵션의 고유 한 약어가 허용됩니다.

주 - 컴파일러 드라이버 (예 : gcc )를 통해 링커가 간접적으로 호출되는 경우 모든 링커 명령 행 옵션 앞에 -Wl (또는 특정 컴파일러 드라이버에 적합한 것이 무엇이든) 접두사가 있어야합니다.

gcc -Wl, - startgroup foo.o bar.o -Wl, - endgroup

그렇지 않으면 컴파일러 드라이버 프로그램이 자동으로 링커 옵션을 삭제하여 링크가 잘못 될 수 있기 때문에 중요합니다.

다음은 GNU 링커에서 허용하는 일반적인 명령 행 스위치의 표입니다 :

-a 키워드

이 옵션은 HP / UX 호환성을 위해 지원됩니다. 키워드 인수는 archive , shared 또는 default 문자열 중 하나 여야합니다. -aarchive 는 기능적으로 -Bstatic 과 동일하며 다른 두 키워드는 기능적으로 -Bdynamic 과 같습니다. 이 옵션은 여러 번 사용할 수 있습니다.

- 건축

- 아키텍처 = 아키텍처

ld 의 현재 릴리스에서이 옵션은 Intel 960 계열의 아키텍처에서만 유용합니다. ld 구성에서 architecture 인수는 960 제품군의 특정 아키텍처를 식별하여 아카이브 라이브러리 검색 경로를 수정하고 보호합니다.

ld의 향후 릴리스는 다른 아키텍처 제품군에 대해 유사한 기능을 지원할 수 있습니다.

-b 입력 형식

- 형식 = 입력 형식

ld 는 두 종류 이상의 오브젝트 파일을 지원하도록 구성 될 수 있습니다. ld 가 이런 식으로 구성된 경우 -b 옵션을 사용하여 명령 행에서이 옵션 뒤에 오는 입력 오브젝트 파일에 대한 2 진 형식을 지정할 수 있습니다. ld 가 대체 객체 형식을 지원하도록 구성되어 있더라도 ld 는 기본 입력 형식으로 각 시스템에서 가장 일반적인 형식을 기대하도록 구성해야하므로 일반적으로이를 지정할 필요가 없습니다. input-format 은 텍스트 문자열로, BFD 라이브러리가 지원하는 특정 형식의 이름입니다. objdump -i를 사용하여 사용 가능한 바이너리 형식을 나열 할 수 있습니다.

비정상적인 바이너리 형식으로 파일을 링크하는 경우이 옵션을 사용할 수 있습니다. 특정 형식의 오브젝트 파일 그룹마다 -b input-format 을 포함하여 -b 를 사용하여 다른 형식의 오브젝트 파일을 연결할 때 명시 적으로 형식을 전환 할 수도 있습니다.

기본 형식은 "GNUTARGET"환경 변수에서 가져옵니다.

"TARGET"명령을 사용하여 스크립트에서 입력 형식을 정의 할 수도 있습니다.

-c MRI 명령 파일

--mri-script = MRI- 명령 파일

MRI가 만든 링커와의 호환성을 위해 ld 는 GNU ld documentation의 MRI Compatible Script Files 섹션에 설명 된 대체, 제한된 명령 언어로 작성된 스크립트 파일을 허용합니다. MRI 스크립트 파일에 -c 옵션을 추가하십시오. 범용 ld 스크립팅 언어로 작성된 링커 스크립트를 실행하려면 -T 옵션을 사용하십시오. MRI-cmdfile 이 없으면 ld-L 옵션으로 지정된 디렉토리 에서이 파일을 찾습니다.

-디

-dc

-dp

이 세 가지 옵션은 동일합니다. 다른 링커와의 호환성을 위해 여러 양식이 지원됩니다. 재배치 가능한 출력 파일이 지정 되더라도 ( -r 을 사용하여) 공용 기호에 공간을 할당합니다. 스크립트 명령 "FORCE_COMMON_ALLOCATION"은 동일한 효과를가집니다.

-e entry

- 항목 = 항목

기본 엔트리 포인트가 아닌 프로그램 실행을 시작하기위한 명시적인 기호로 엔트리 를 사용하십시오. entry 라는 심볼이 없다면, 링커는 엔트리 를 숫자로 파싱하여 엔트리 주소로 사용하려고 시도합니다 (숫자는 기수 10으로 해석되며, 기수 16에는 선행 0x 를 사용할 수 있습니다. 기지 8).

-이자형

--export-dynamic

동적으로 링크 된 실행 파일을 만들 때 모든 심볼을 동적 심볼 테이블에 추가하십시오. 동적 기호표는 런타임에 동적 개체에서 볼 수있는 기호 집합입니다.

이 옵션을 사용하지 않으면 동적 심볼 테이블에는 일반적으로 링크에 언급 된 일부 동적 객체에서 참조하는 심볼 만 포함됩니다.

"dlopen"을 사용하여 다른 동적 객체 대신 프로그램에서 정의한 심볼을 다시 참조해야하는 동적 객체를로드하는 경우 프로그램 자체를 링크 할 때이 옵션을 사용해야 할 수도 있습니다.

또한 버전 스크립트를 사용하여 출력 형식이 지원하는 경우 동적 기호 테이블에 추가 할 기호를 제어 할 수 있습니다. @ref {VERSION}의 --version-script 에 대한 설명을 참조하십시오.

-EB

빅 엔디안 객체를 링크합니다. 이것은 기본 출력 형식에 영향을줍니다.

-엘자

리틀 엔디안 오브젝트를 연결하십시오. 이것은 기본 출력 형식에 영향을줍니다.

-에프

- 보조 이름

ELF 공유 객체를 만들 때 내부 DT_AUXILIARY 필드를 지정된 이름으로 설정합니다. 이것은 공유 객체의 심볼 테이블이 공유 객체 이름 의 심볼 테이블에서 보조 필터로 사용되어야한다는 것을 동적 링커에 알려줍니다.

나중에이 필터 개체에 대해 프로그램을 연결하면 프로그램을 실행할 때 동적 링커에 DT_AUXILIARY 필드가 표시됩니다. 동적 링커가 필터 객체의 심볼을 해석하면 먼저 공유 객체 이름에 정의가 있는지 확인합니다. 존재하는 경우, 필터 오브젝트의 정의 대신에 사용됩니다. 공유 오브젝트 이름 은 존재할 필요가 없습니다. 따라서 공유 객체 이름 은 특정 기능의 대체 구현을 제공하는 데 사용될 수 있습니다. 아마도 디버깅 또는 시스템 특정 성능을위한 것입니다.

이 옵션은 두 번 이상 지정할 수 있습니다. DT_AUXILIARY 항목은 명령 줄에 나타나는 순서대로 만들어집니다.

-F 이름

- 필터 이름

ELF 공유 객체를 만들 때 내부 DT_FILTER 필드를 지정된 이름으로 설정합니다. 이것은 생성되는 공유 객체의 심볼 테이블이 공유 객체 이름 의 심볼 테이블에서 필터로 사용되어야한다는 것을 동적 링커에 알려줍니다.

나중에이 필터 개체에 대해 프로그램을 연결하면 프로그램을 실행할 때 동적 링커에 DT_FILTER 필드가 표시됩니다. 동적 링커는 평소대로 필터 객체의 심볼 테이블에 따라 심볼을 확인하지만 실제로 공유 객체 이름 에있는 정의에 연결됩니다. 따라서 필터 객체는 객체 이름이 제공하는 심볼의 하위 집합을 선택하는 데 사용할 수 있습니다.

일부 오래된 링커는 입력 및 출력 객체 파일 모두에 대해 객체 파일 형식을 지정하기 위해 컴파일 도구 체인 전체에서 -F 옵션을 사용했습니다. GNU 링커는 -b , --format , --oformat 옵션, 링커 스크립트의 "TARGET"명령 및 "GNUTARGET"환경 변수와 같은 다른 메커니즘을이 용도로 사용합니다. ELF 공유 객체를 만들지 않으면 GNU 링커는 -F 옵션을 무시합니다.

-fini 이름

ELF 실행 파일이나 공유 객체를 만들 때 DT_FINI를 함수의 주소로 설정하여 실행 가능 객체 나 공유 객체가 언로드 될 때 NAME을 호출하십시오. 기본적으로 링커는 호출 할 함수로 "_fini"를 사용합니다.

-지

무시 됨. 다른 도구와의 호환성을 위해 제공됩니다.

-G

--gpsize = value

크기에 GP 레지스터를 사용하여 최적화 할 개체의 최대 크기를 설정하십시오. 이는 크고 작은 오브젝트를 다른 섹션에 넣을 수있는 MIPS ECOFF와 같은 오브젝트 파일 형식에서만 의미가 있습니다. 다른 오브젝트 파일 형식에서는 무시됩니다.

- 이름

-soname = name

ELF 공유 객체를 만들 때 내부 DT_SONAME 필드를 지정된 이름으로 설정하십시오. 실행 파일이 DT_SONAME 필드가있는 공유 객체와 링크되면 실행 파일이 실행될 때 동적 링커는 링커에 지정된 파일 이름을 사용하지 않고 DT_SONAME 필드에 지정된 공유 객체를로드하려고 시도합니다.

-나는

증분 링크를 수행하십시오 (옵션 -r 과 동일).

- 이름

ELF 실행 파일이나 공유 객체를 만들 때 DT_INIT를 함수의 주소로 설정하여 실행 가능 객체 나 공유 객체가로드 될 때 NAME을 호출하십시오. 기본적으로 링커는 호출 할 함수로 "_init"을 사용합니다.

-l 아카이브

--library = archive

링크 할 파일 목록에 아카이브 파일 아카이브 를 추가하십시오. 이 옵션은 여러 번 사용할 수 있습니다. ld 는 경로 목록에서 지정된 모든 아카이브에 대해 "libarchive.a"가 있는지 검색합니다.

공유 라이브러리를 지원하는 시스템에서 ld 는 ".a"이외의 확장자를 가진 라이브러리를 검색 할 수도 있습니다. 특히 ELF와 SunOS 시스템에서 ld 는 확장자가 ".so"인 라이브러리를 찾기 전에 확장자가 ".so"인 라이브러리를 검색합니다. 관례 상 ".so"확장자는 공유 라이브러리를 나타냅니다.

링커는 명령 줄에 지정된 위치에서 아카이브를 한 번만 검색합니다. 아카이브가 명령 줄에서 아카이브 앞에 나타나는 일부 객체에서 정의되지 않은 심볼을 정의하면 링커는 아카이브의 해당 파일을 포함합니다. 그러나 명령 줄의 뒷부분에 나타나는 객체에서 정의되지 않은 심볼로 인해 링커에서 아카이브를 다시 검색하지 않습니다.

링커가 아카이브를 여러 번 검색하도록하는 방법은 - ( 옵션)을 참조하십시오.

명령 행에 동일한 아카이브를 여러 번 나열 할 수 있습니다.

이러한 유형의 아카이브 검색은 유닉스 링커에게 표준이다. 그러나 ld onAIX를 사용하는 경우 AIX 링커의 동작과 다릅니다.

-L searchdir

--library-path = searchdir

ld 가 아카이브 라이브러리와 ld 제어 스크립트를 검색 할 경로 목록에 searchdir 경로를 추가하십시오. 이 옵션은 여러 번 사용할 수 있습니다. 디렉토리는 명령 행에 지정된 순서대로 검색됩니다. 명령 행에 지정된 디렉토리는 기본 디렉토리보다 먼저 검색됩니다. 모든 -L 옵션은 옵션의 순서와 상관없이 모든 -l 옵션에 적용됩니다.

searchdir 이 "="로 시작하면 "="은 sysroot 접두어 로 바뀝니다.이 접두어 는 링커가 구성 될 때 지정된 경로입니다.

검색되는 경로의 기본 세트 ( -L 과 함께 지정되지 않음)는 ld 가 어떤 에뮬레이션 모드를 사용하는지, 경우에 따라 어떻게 구성되었는지에 따라 달라집니다.

경로는 "SEARCH_DIR"명령을 사용하여 링크 스크립트에 지정할 수도 있습니다. 이 방법으로 지정된 디렉토리는 링커 스크립트가 명령 줄에 나타나는 지점에서 검색됩니다.

-m 에뮬레이션

에뮬레이션 링커를 에뮬레이트하십시오. --verbose 또는 -V 옵션을 사용하여 사용 가능한 에뮬레이션을 나열 할 수 있습니다.

-m 옵션을 사용하지 않으면 "LDEMULATION"환경 변수가 정의 된 경우 에뮬레이션이 사용됩니다.

그렇지 않으면 기본 에뮬레이션은 링커가 구성된 방법에 따라 다릅니다.

-엠

--print-map

표준 출력에 링크 맵을 인쇄하십시오. 링크 맵은 다음을 포함하여 링크에 대한 정보를 제공합니다.

*

오브젝트 파일과 심볼이 메모리에 매핑되는 위치.

*

공통 기호가 할당되는 방법.

*

링크에 포함 된 모든 아카이브 멤버. 아카이브 멤버가 가져온 심볼을 언급합니다.

-엔

--nmagic

가능한 경우 섹션의 페이지 정렬을 해제하고 출력을 "NMAGIC"으로 표시하십시오.

-엔

어지러운

텍스트 및 데이터 섹션을 읽고 쓸 수 있도록 설정하십시오. 또한 데이터 세그먼트를 페이지 정렬하지 말고 공유 라이브러리에 대한 링크를 비활성화하십시오. 출력 형식이 유닉스 스타일의 매직 넘버를 지원한다면 출력을 "OMAGIC"으로 표시하십시오.

- 아니 - omagic

이 옵션은 -N 옵션의 효과 대부분을 무효화합니다. 텍스트 섹션을 읽기 전용으로 설정하고 데이터 세그먼트를 페이지에 맞 춥니 다. 주 -이 옵션은 공유 라이브러리에 대한 링크를 활성화하지 않습니다. 이것을 위해 -Bdynamic 을 사용하십시오.

-o 출력

--output = 출력

ld에 의해 생성 된 프로그램의 이름으로 output 을 사용하십시오; 이 옵션을 지정하지 않으면 a.out 이라는 이름이 기본적으로 사용됩니다. 스크립트 명령 "OUTPUT"은 출력 파일 이름을 지정할 수도 있습니다.

-O 수준

level 이 0보다 큰 숫자 값 이면 ld 는 출력을 최적화합니다. 이 작업은 상당히 오래 걸릴 수 있으므로 최종 바이너리에서만 활성화해야합니다.

-큐

--emit-relocs

재배치 섹션과 내용을 완벽하게 연결된 exececutables에 그대로 두십시오. 실행 파일을 올바르게 수정하려면 게시 링크 분석 및 최적화 도구에이 정보가 필요할 수 있습니다. 결과적으로 실행 파일이 커집니다.

이 옵션은 현재 ELF 플랫폼에서만 지원됩니다.

-아르 자형

- relocateable

재배치 가능한 출력을 생성하십시오 --- 즉, ld의 입력으로 사용될 수있는 출력 파일을 생성하십시오. 이를 부분 링크 라고합니다. 부수적으로 표준 유닉스 매직 번호를 지원하는 환경에서이 옵션은 출력 파일의 매직 넘버를 "OMAGIC"으로 설정합니다. 이 옵션을 지정하지 않으면 절대 파일이 생성됩니다. C ++ 프로그램을 연결할 때이 옵션 생성자에 대한 참조를 확인 하지 않습니다 . 그렇게하려면,

입력 파일의 형식이 출력 파일과 같지 않을 경우 부분 연결은 해당 입력 파일에 재배치가없는 경우에만 지원됩니다. 다른 출력 형식에는 추가 제한이있을 수 있습니다. 예를 들어 일부 "a.out"기반 형식은 다른 형식의 입력 파일과의 부분 연결을 전혀 지원하지 않습니다.

이 옵션은 -i 와 같은 기능을합니다.

-R filename

--just-symbols = filename

파일 이름 에서 심볼 이름과 그 주소를 읽되 , 파일 이름을 재배치하거나 출력에 포함하지 않습니다. 이렇게하면 출력 파일이 다른 프로그램에 정의 된 메모리의 절대 위치를 상징적으로 참조 할 수 있습니다. 이 옵션을 두 번 이상 사용할 수 있습니다.

다른 ELF 링커와의 호환성을 위해 -R 옵션 뒤에 파일 이름이 아닌 디렉토리 이름이 오면 -rpath 옵션으로 처리됩니다.

-에스

- 스트립 - 모두

출력 파일에서 모든 기호 정보를 생략하십시오.

-에스

--strip-debug

출력 파일에서 디버거 기호 정보 (모든 기호가 아님)는 생략하십시오.

-티

--자취

입력 파일의 이름을 ld가 처리 할 때 인쇄합니다.

-T 스크립트 파일

--script = scriptfile

링커 스크립트로 scriptfile 을 사용하십시오. 이 스크립트는 ld 의 기본 링커 스크립트를 (추가하는 대신) 대체 하므로 commandfile 은 출력 파일을 설명하는 데 필요한 모든 것을 지정해야합니다. scriptfile 이 현재 디렉토리에 존재하지 않으면 "ld"는 -L 옵션 앞에 지정된 디렉토리에서이를 찾습니다. 여러 개의 -T 옵션이 누적됩니다.

-u 기호

--undefined = symbol

심볼 을 출력 파일에 정의되지 않은 심볼로 입력하십시오. 이렇게하면 표준 라이브러리에서 추가 모듈을 연결할 수 있습니다. -u 는 다른 옵션 인수로 반복되어 추가 정의되지 않은 기호를 입력 할 수 있습니다. 이 옵션은 "EXTERN"링커 스크립트 명령과 동일합니다.

~

C ++ 프로그램이 아닌 다른 경우,이 옵션은 -r 과 동일합니다. 즉, 재배치 가능한 출력 --- 즉 ld의 입력으로 사용될 수있는 출력 파일을 생성합니다. C ++ 프로그램을 링크 할 때 -Ur -r 과 달리 생성자에 대한 참조를 확인합니다. -Ur 과 연결된 파일에 대해서는 사용하지 않습니다. 일단 생성자 테이블이 빌드되면 추가 할 수 없습니다. 마지막 부분 링크에만 사용하고 다른 부분 링크에는 -r 을 사용하십시오.

- 유니크 [= SECTION ]

SECTION 과 일치하는 모든 입력 섹션에 대해 별도의 출력 섹션을 작성하거나 선택적 와일드 카드 SECTION 인수가 누락 된 경우 모든 고아 입력 섹션에 대해 출력 섹션을 작성합니다. 고아 섹션은 링커 스크립트에서 특별히 언급되지 않은 섹션입니다. 명령 행에서이 옵션을 여러 번 사용할 수 있습니다. 링커 스크립트의 출력 섹션 할당을 무시하고 같은 이름을 가진 입력 섹션의 정상적인 병합을 방지합니다.

-V

--번역

-V

ld 의 버전 번호를 표시하십시오. 또한 -V 옵션은 지원되는 에뮬레이션을 나열합니다.

-엑스

--discard-all

모든 로컬 기호를 삭제하십시오.

-엑스

--discard-locals

모든 임시 지역 기호를 삭제하십시오. 대부분의 타겟에서 이것은 L로 시작하는 모든 로컬 심볼입니다.

- y 기호

--trace-symbol = 기호

기호 가 나타나는 각 링크 된 파일의 이름을 인쇄하십시오. 이 옵션은 여러 번 지정할 수 있습니다. 많은 시스템에서 밑줄 문자를 앞에 붙여야합니다.

이 옵션은 링크에 정의되지 않은 기호가 있지만 참조의 출처를 모르는 경우에 유용합니다.

-Y 경로

기본 라이브러리 검색 경로에 경로 를 추가하십시오. 이 옵션은 Solaris 호환성을 위해 존재합니다.

-z 키워드

인식 된 키워드는 "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", "origin", "combreloc", "nocombreloc"및 "nocompreloc" ". Solaris 호환성을 위해 다른 키워드는 무시됩니다. "initfirst"는 런타임에 다른 객체보다 먼저 초기화 될 객체를 표시합니다. "interpose"는 심볼 테이블이 삽입 된 모든 심볼 앞에 기본 실행 파일을 삽입하고, "loadfltr"은 런타임에 즉시 filtees가 처리되는 객체를 표시합니다. "nodefaultlib"는이 객체의 종속성에 대한 검색이 무시할 객체를 표시합니다 모든 기본 라이브러리 검색 경로. "nodelete"는 객체가 런타임에 언로드되지 않아야 함을 표시합니다. "nodlopen"은 "dlopen"에서 사용할 수없는 객체를 표시합니다. "nodump"마크는 "dldump"에 의해 덤프 될 수 없습니다. "now"는 객체에 비 지연 런타임 바인딩을 표시합니다. "origin"표시에는 객체에 $ ORIGIN이 포함될 수 있습니다. "defs"는 정의되지 않은 기호를 허용하지 않습니다. "muldefs"는 여러 정의를 허용합니다. "combreloc"은 여러 재배치 섹션을 결합하고 정렬하여 동적 심볼 검색 캐싱을 가능하게합니다.

"nocombreloc"은 여러 재구성 섹션 결합을 비활성화합니다. "nocopyreloc"는 사본 재배치의 생성을 불가능하게합니다.

- ( 아카이브 -)

--start-group 아카이브 --end-group

아카이브아카이브 파일 의 목록이어야 합니다 . 파일 이름은 명시 적이 거나 -l 옵션 일 수 있습니다.

정의되지 않은 참조가 새로 만들지 않을 때까지 지정된 아카이브가 반복적으로 검색됩니다. 일반적으로 아카이브는 명령 줄에 지정된 순서대로 한 번만 검색됩니다. 해당 아카이브의 심볼이 나중에 명령 줄에 나타나는 아카이브에서 객체가 참조하는 정의되지 않은 심볼을 해결해야하는 경우 링커는 해당 참조를 해결할 수 없습니다. 아카이브를 그룹화하여 가능한 모든 참조가 해결 될 때까지 반복적으로 검색합니다.

이 옵션을 사용하면 상당한 성능 비용이 발생합니다. 두 개 이상의 아카이브간에 피할 수없는 순환 참조가있는 경우에만 사용하는 것이 가장 좋습니다.

--accept-unknown-input-arch

--no-accept-unknown-input-arch

아키텍처를 인식 할 수없는 입력 파일을 링커가 받아들이도록 지시합니다. 사용자는 자신이하고있는 일을 알고 의도적으로 알 수없는 입력 파일에 링크하려고한다고 가정합니다. 릴리스 2.14 이전의 링커의 기본 동작이었습니다. 릴리스 2.14 이후의 기본 동작은 이러한 입력 파일을 거부하는 것이므로 이전 동작을 복원하기 위해 --accept-unknown-input-arch 옵션이 추가되었습니다.

-assert 키워드

SunOS와의 호환성위해이 옵션은 무시 됩니다 .

- 동적

-dy

-call_shared

동적 라이브러리 링크. 이는 공유 라이브러리 가 지원되는 플랫폼에서만 의미가 있습니다. 이 옵션은 일반적으로 이러한 플랫폼에서 기본값입니다. 이 옵션의 다른 변형은 다양한 시스템과의 호환성을위한 것입니다. 명령 행에서이 옵션을 여러 번 사용할 수 있으며, 그 뒤에 오는 -l 옵션에 대한 라이브러리 검색에 영향을 미칩니다.

-Bgroup

동적 섹션의 'DT_FLAGS_1'항목에 'DF_1_GROUP'플래그를 설정합니다. 이로 인해 런타임 링커는이 객체의 룩업을 처리하고 그 의존성은 그룹 내에서만 수행됩니다. --no-undefined 가 함축되어 있습니다. 이 옵션은 공유 라이브러리 를 지원하는 ELF 플랫폼에서만 의미가 있습니다.

- 정적

-dn

-non_shared

-공전

공유 라이브러리에 링크하지 마십시오. 이는 공유 라이브러리가 지원되는 플랫폼에서만 의미가 있습니다. 이 옵션의 다른 변형은 다양한 시스템과의 호환성을위한 것입니다. 명령 행에서이 옵션을 여러 번 사용할 수 있으며, 그 뒤에 오는 -l 옵션에 대한 라이브러리 검색에 영향을 미칩니다.

-Bymbolic

공유 라이브러리를 작성할 때 전역 심볼에 대한 참조를 공유 라이브러리 내의 정의에 바인드하십시오 (있는 경우). 일반적으로 공유 라이브러리에 링크 된 프로그램은 공유 라이브러리 내의 정의를 대체 할 수 있습니다. 이 옵션은 공유 라이브러리를 지원하는 ELF 플랫폼에서만 의미가 있습니다.

- 검사 섹션

--no-check-sections

링커가 섹션 주소를 확인한 후에 중복이 있는지 확인 하지 않도록 링커에 요청합니다. 일반적으로 링커는이 검사를 수행하고 중복이 발견되면 적절한 오류 메시지를 생성합니다. 링커는 오버레이에서 섹션에 대해 알고 있고 섹션에 대해 여유를 만듭니다. 명령 줄 스위치 --check-sections 을 사용하여 기본 동작을 복원 할 수 있습니다.

- 참조

상호 참조 테이블을 출력하십시오. 링커 맵 파일이 생성되면 상호 참조 테이블이 맵 파일에 인쇄됩니다. 그렇지 않으면 표준 출력에 인쇄됩니다.

테이블 형식은 의도적으로 단순하므로 필요한 경우 스크립트로 쉽게 처리 할 수 ​​있습니다. 기호는 이름별로 정렬하여 인쇄됩니다. 각 기호에 대해 파일 이름 목록이 제공됩니다. 심볼이 정의 된 경우 첫 번째 파일은 정의의 위치입니다. 나머지 파일에는 기호에 대한 참조가 들어 있습니다.

--no-define-common

이 옵션은 공통 기호에 주소 지정을 금지합니다. 스크립트 명령 "INHIBIT_COMMON_ALLOCATION"은 동일한 효과를가집니다.

--no-define-common 옵션을 사용하면 출력 파일 유형을 선택하여 Common 기호에 주소를 할당하는 결정을 분리 할 수 ​​있습니다. 그렇지 않으면 비 - 재배치 가능 출력 유형은 주소를 공통 기호에 강제로 지정합니다. --no-define-common을 사용하면 공유 라이브러리에서 참조되는 공통 심볼에 주 프로그램의 주소 만 할당 할 수 있습니다. 이렇게하면 공유 라이브러리에서 사용되지 않는 중복 공간이 제거되고 런타임 심볼 해석을위한 특수 검색 경로가있는 많은 동적 모듈이있을 때 잘못된 복제본을 해결할 때 발생할 수있는 혼란을 방지 할 수 있습니다.

--defsym symbol = expression

expression에 의해 주어진 절대 주소를 포함하는 출력 파일에 전역 심볼을 만듭니다. 이 옵션을 명령 줄에서 여러 기호를 정의하는 데 필요한만큼 여러 번 사용할 수 있습니다. 16 진수 상수 또는 기존 기호의 이름을 지정하거나 "+"및 "-"를 사용하여 16 진수 상수 또는 기호를 더하거나 뺄 수있는 한정된 형식의 산술 연산이 지원됩니다. 보다 정교한 표현식이 필요한 경우 스크립트에서 링커 명령 언어를 사용해보십시오. 주 : 기호 , 등호 (`` = '') 및 표현식 사이에는 공백이 없어야합니다.

--demangle [= 스타일 ]

- 노 demangle

이 옵션은 오류 메시지 및 다른 출력의 기호 이름을 디맨드할지 여부를 제어합니다. 링커가 demangle 명령을 받으면 심볼 이름을 읽을 수있는 방식으로 표시하려고 시도합니다. 오브젝트 파일 형식에 의해 사용되는 경우 맨 앞의 밑줄을 제거하고 C ++로 변환 된 심볼 이름을 사용자가 읽을 수있는 이름으로 변환합니다. 다른 컴파일러는 서로 다른 mangling 스타일을 가지고 있습니다. 선택적 demangling 스타일 인수는 컴파일러에 적합한 디맹 글링 스타일을 선택하는 데 사용할 수 있습니다. 링커는 환경 변수 COLLECT_NO_DEMANGLE 이 설정되어 있지 않으면 기본적으로 분리됩니다. 이 옵션은 기본값을 무시하는 데 사용할 수 있습니다.

--dynamic-linker 파일

동적 링커의 이름을 설정하십시오. 이는 동적으로 링크 된 ELF 실행 파일을 생성 할 때만 의미가 있습니다. 기본 동적 링커는 일반적으로 정확합니다. 자신이하는 일을 알지 못하면 이것을 사용하지 마십시오.

- embedded-relocs

이 옵션은 -membedded-pic 옵션으로 생성 된 MIPS 내장 PIC 코드를 GNU 컴파일러 및 어셈블러에 연결할 때만 의미가 있습니다. 그것은 링커가 정적으로 초기화 된 데이터를 포인터 값으로 재배치하기 위해 런타임에 사용될 수있는 테이블을 생성하게합니다. 자세한 내용은 testsuite / ld-empic의 코드를 참조하십시오.

- 치명적인 경고

모든 경고를 오류로 처리하십시오 .

--force-exe-suffix

출력 파일의 접미사가 .exe인지 확인하십시오.

성공적으로 빌드 된 완전히 링크 된 출력 파일에 " .exe "접미사가 없으면이 옵션은 링커가 출력 파일을 ".exe"접미사가있는 같은 이름으로 복사하도록합니다. 이 옵션은 Microsoft Windows 호스트에서 수정되지 않은 Unix makefile 을 사용할 때 유용합니다. 일부 Windows 버전은 ".exe"접미어로 끝나지 않는 한 이미지를 실행하지 않기 때문입니다.

--no-gc-sections

--gc-sections

사용되지 않는 입력 섹션의 가비지 수집을 활성화합니다. 이 옵션을 지원하지 않는 대상에서는 무시됩니다. 이 옵션은 -r 과 호환되지 않으며 동적 링크와 함께 사용해야합니다. 이 가비지 콜렉션을 수행하지 않는 기본 동작은 명령 행에 --no-gc-sections 을 지정하여 복원 할 수 있습니다.

--도움

명령 행 옵션의 요약을 표준 출력에 인쇄하고 종료하십시오.

- 목표 - 도움말

표준 출력에서 ​​모든 대상 특정 옵션의 요약을 인쇄하고 종료하십시오.

맵 맵 파일

링크 맵을 파일 mapfile에 인쇄하십시오. 위의 -M 옵션에 대한 설명을 참조하십시오.

- 기억하지 마라.

ld는 일반적으로 입력 파일의 기호 테이블을 메모리 에 캐싱하여 메모리 사용 속도를 최적화합니다. 이 옵션은 필요한 경우 심볼 테이블을 다시 읽음으로써 ld 가 대신 메모리 사용을 최적화하도록 지시합니다. 대형 실행 파일을 링크하는 동안 ld 가 메모리 공간을 모두 소모 할 경우이 작업이 필요할 수 있습니다.

--no-undefined

-z defs

일반적으로 비 기호 공유 라이브러리를 만들 때 정의되지 않은 기호는 허용되며 런타임 로더가 해결하도록 남겨 둡니다. 이 옵션은 정의되지 않은 기호를 허용하지 않습니다.

- 허용 다중 정의

-z muldefs

일반적으로 심볼이 여러 번 정의되면 링커에서 치명적인 오류를보고합니다. 이 옵션은 여러 정의를 허용하며 첫 번째 정의가 사용됩니다.

--allow-shlib-undefined

--no-undefined가 설정된 경우에도 공유 객체에서 정의되지 않은 심볼을 허용합니다. 결과적으로 일반 객체의 정의되지 않은 심볼은 여전히 ​​오류를 유발하지만 공유 객체의 정의되지 않은 심볼은 무시됩니다. no_undefined의 구현은 런타임 링커가 정의되지 않은 심볼을 숨 깁니다. 그러나 공유 라이브러리의 정의되지 않은 심볼은 커널이로드 할 때 패치하여 현재 아키텍처에 가장 적합한 함수를 선택하기 때문에 적어도 하나의 시스템 (BeOS)이 있습니다. IE는 동적으로 적절한 memset 함수를 선택합니다. 분명히 HPPA 공유 라이브러리에는 정의되지 않은 기호가있는 것이 정상입니다.

--no-undefined-version

일반적으로 기호에 정의되지 않은 버전이 있으면 링커에서이를 무시합니다. 이 옵션은 버전이 정의되지 않은 심볼을 허용하지 않으며 대신 치명적인 오류가 발생합니다.

--no-warn-mismatch

일반적으로 ld 는 서로 다른 프로세서 나 다른 엔디안에 대해 컴파일 되었기 때문에 어떤 이유로 불일치하는 입력 파일을 함께 연결하려고하면 오류가 발생합니다. 이 옵션은 가능한 오류를 자동으로 허용해야 함을 ld 에 알려줍니다. 이 옵션은 링커 오류가 부적절한 지 확인하기 위해 특별한 조치를 취한 경우에만주의해서 사용해야합니다.

--no-whole-archive

후속 아카이브 파일에 대한 --whole-archive 옵션의 효과를 끕니다.

--noinhibit-exec

사용 가능한 경우 실행 가능 출력 파일을 보존하십시오. 일반적으로 링크 프로세스 중에 오류가 발생하면 링커에서 출력 파일을 생성하지 않습니다. 오류를 발행 할 때 출력 파일을 쓰지 않고 종료합니다.

-nostdlib

명령 행에서 명시 적으로 지정된 라이브러리 디렉토리 만 검색하십시오. 링커 스크립트에 지정된 라이브러리 디렉토리 (명령 행에 지정된 링커 스크립트 포함)는 무시됩니다.

--oformat 출력 형식

ld 는 두 종류 이상의 오브젝트 파일을 지원하도록 구성 될 수 있습니다. ld 가 이런 방식으로 구성된 경우, --oformat 옵션을 사용하여 출력 오브젝트 파일의 2 진 형식을 지정할 수 있습니다. ld 가 대체 객체 형식을 지원하도록 구성되어 있더라도 ld 가 기본 출력 형식으로 각 시스템에서 가장 일반적인 형식을 생성하도록 구성해야하므로 일반적으로이를 지정하지 않아도됩니다. output-format 은 텍스트 문자열로, BFD 라이브러리가 지원하는 특정 형식의 이름입니다. objdump -i를 사용하여 사용 가능한 바이너리 형식을 나열 할 수 있습니다. 스크립트 명령 "OUTPUT_FORMAT"도 출력 형식을 지정할 수 있지만이 옵션이이를 무시합니다.

--qmagic

이 옵션은 Linux 호환성을 위해 무시됩니다.

-Qy

이 옵션은 SVR4 호환성을 위해 무시됩니다.

--편하게 하다

기계 의존 효과가있는 옵션. 이 옵션은 일부 대상에서만 지원됩니다.

일부 플랫폼에서 --relax 옵션은 링커가 주소 모드를 완화하고 출력 객체 파일에서 새 명령어를 합성하는 것과 같이 프로그램에서 주소 지정을 해결할 때 가능한 전역 최적화를 수행합니다.

일부 플랫폼에서는 이러한 링크를 통해 전역 최적화가 결과 실행 파일의 기호 디버깅 을 불가능하게 만들 수 있습니다. 이것은 Matsushita MN10200 및 MN10300 프로세서 제품군의 경우로 알려져 있습니다.

이것이 지원되지 않는 플랫폼에서는 --relax 가 허용되지만 무시됩니다.

--retain-symbols-file 파일 이름

파일 filename에 나열된 기호 유지하고 나머지는 버립니다. filename 은 단순한 플랫 파일이며 한 줄에 하나의 심볼 이름이 있습니다. 이 옵션은 런타임 메모리를 절약하기 위해 점진적으로 큰 글로벌 심볼 테이블을 축적하는 환경 (VxWorks 등)에서 특히 유용합니다.

--retain-symbols-file 은 정의되지 않은 심볼이나 재배치에 필요한 심볼을 버리지 않습니다.

명령 줄에서 --retain-symbols-file을 한 번만 지정할 수 있습니다. -s-S를 무시합니다.

-rpath 디렉토리

런타임 라이브러리 검색 경로에 디렉토리를 추가하십시오. ELFexecutable을 공유 객체와 연결할 때 사용됩니다. 모든 -rpath 인수는 연결되어 런타임 링커에 전달되며 런타임 링커는이를 런타임에 공유 객체를 찾는 데 사용합니다. -rpath 옵션은 링크에 명시 적으로 포함 된 공유 객체가 필요로하는 공유 객체를 찾을 때도 사용됩니다. -rpath-link 옵션에 대한 설명을 참조하십시오. ELF 실행 파일을 링크 할 때 -rpath 를 사용하지 않으면 환경 변수 "LD_RUN_PATH"의 내용이 정의 된 경우 사용됩니다.

SunOS에서는 -rpath 옵션을 사용할 수도 있습니다. 기본적으로 SunOS에서 링커는 주어진 모든 -L 옵션 중에서 런타임 검색 패치를 구성합니다. -rpath 옵션을 사용하면 런타임 검색 경로가 -rpath 옵션을 사용하여 독점적으로 구성되어 -L 옵션을 무시합니다. 이것은 gcc를 사용할 때 유용 할 수 있습니다. gcc는 NFS 마운트 파일 시스템에있을 수있는 많은 -L 옵션을 추가합니다.

다른 ELF 링커와의 호환성을 위해 -R 옵션 뒤에 파일 이름이 아닌 디렉토리 이름이 오면 -rpath 옵션으로 처리됩니다.

-rpath-link DIR

ELF 또는 SunOS를 사용할 때 하나의 공유 라이브러리가 다른 라이브러리를 요구할 수 있습니다. 이것은 "ld -shared"링크가 공유 라이브러리를 입력 파일 중 하나로 포함 할 때 발생합니다.

링커는 비공유, 비 변동 가능 링크를 수행 할 때 이러한 종속성을 발견하면 명시 적으로 포함되지 않은 경우 필요한 공유 라이브러리를 찾은 다음 링크에 포함하려고 시도합니다. 이 경우 -rpath-link 옵션은 검색 할 첫 x 째 디렉토리 세트를 지정합니다. -rpath-link 옵션은 콜론으로 구분 된 이름 목록을 지정하거나 여러 번 나타나는 방식으로 디렉토리 이름의 시퀀스를 지정할 수 있습니다.

이 옵션은 공유 라이브러리로 하드 컴파일 된 검색 경로를 겹쳐 쓸 때주의해서 사용해야합니다. 이 경우 런타임 링커가 수행하는 것과 다른 검색 경로를 의도하지 않게 사용할 수 있습니다.

링커는 다음 검색 경로를 사용하여 필수 공유 라이브러리를 찾습니다.

1.

-rpath-link 옵션으로 지정된 디렉토리.

2.

-rpath 옵션으로 지정된 디렉토리. -rpath-rpath-link 의 차이점은 -rpath 옵션으로 지정된 디렉토리가 실행 파일에 포함되어 런타임에 사용되는 반면 -rpath-link 옵션은 링크시에만 유효하다는 것입니다. 네이티브 링커 전용입니다.

삼.

ELF 시스템에서 -rpath 및 "rpath-link"옵션을 사용하지 않으면 환경 변수 "LD_RUN_PATH"의 내용을 검색하십시오. 네이티브 링커 전용입니다.

4.

SunOS에서 -rpath 옵션을 사용하지 않으면 -L 옵션을 사용하여 지정된 디렉토리를 검색하십시오.

5.

네이티브 링커의 경우, 환경 변수 "LD_LIBRARY_PATH"의 내용.

6.

네이티브 ELF 링커의 경우, 공유 라이브러리의 "DT_RUNPATH"또는 "DT_RPATH"디렉토리에 필요한 공유 라이브러리가 검색됩니다. "DT_RUNPATH"항목이 있으면 "DT_RPATH"항목이 무시됩니다.

7.

기본 디렉토리, 보통 / lib/ usr / lib .

8.

ELF 시스템의 원시 링커의 경우 /etc/ld.so.conf 파일이 있으면 해당 파일에서 찾은 디렉토리 목록입니다.

필요한 공유 라이브러리를 찾지 못하면 링커는 경고를 발행하고 링크를 계속 진행합니다.

공유 된

-Bshareable

공유 라이브러리를 만듭니다. 현재 ELF, XCOFF 및 SunOS 플랫폼에서만 지원됩니다. SunOS에서 링커는 -e 옵션을 사용하지 않고 링크에 정의되지 않은 기호가 있으면 자동으로 공유 라이브러리를 만듭니다.

--sort-common

이 옵션은 ld 가 공통 심볼을 적절한 출력 섹션에 배치 할 때 크기별로 정렬하도록 지시합니다. 먼저 모든 1 바이트 기호를 온 다음 2 바이트 모두를 입력 한 다음 4 바이트를 모두 입력 한 다음 다른 모든 것을 입력하십시오. 이것은 정렬 제약으로 인해 심볼 사이의 갭을 방지하기위한 것입니다.

--split-by-file [ 크기 ]

--split-by-reloc과 비슷 하지만 크기 에 도달하면 각 입력 파일에 대해 새로운 출력 섹션을 만듭니다. 크기 를 지정하지 않으면 기본값은 1입니다.

--split-by-reloc [ count ]

파일의 단일 출력 섹션에 더 이상 재배치가 포함되지 않도록 출력 파일에 추가 섹션을 만들려고합니다. 이는 COFF 객체 파일 형식으로 특정 실시간 커널에 다운로드 할 수있는 큰 재배치 가능 파일을 생성 할 때 유용합니다. COFF는 단일 섹션에서 65535 개 이상의 재배치를 나타낼 수 없으므로 임의의 섹션을 지원하지 않는 오브젝트 파일 형식에서는 작동하지 않습니다. 링커는 재분배를 위해 개별 입력 섹션을 분할하지 않으므로 단일 입력 섹션에 개수 재배치가 포함되는 경우 하나의 출력 섹션에 많은 재배치가 포함됩니다. count의 기본값은 32768입니다.

- 통계

실행 시간 및 메모리 사용량과 같은 링커 작업에 대한 통계를 계산하고 표시합니다.

- 전통적 형식

일부 타겟의 경우 ld 의 출력은 기존 링커의 출력과 일부 다른 점이 있습니다. 이 스위치는 ld 에게 대신 전통적인 형식을 사용하도록 요청합니다.

예를 들어 SunOS에서 ld 는 심볼 문자열 테이블에 중복 된 항목을 결합합니다. 전체 디버깅 정보가 출력 파일의 크기를 30 % 이상 줄일 수 있습니다. 아쉽게도 SunOS "dbx"프로그램은 결과 프로그램을 읽을 수 없습니다 ( "gdb"는 문제가 없습니다). --traditional-format 스위치는 ld 가 중복 된 항목을 결합하지 않도록 지시합니다.

--section-start sectionname = org

org 에서 제공 한 절대 주소에서 출력 파일 의 섹션을 찾으십시오. 이 옵션을 명령 줄에서 여러 섹션을 찾으려면 필요한만큼 여러 번 사용할 수 있습니다. org 는 단일 한 16 진수 여야합니다. 다른 링커와의 호환성을 위해 일반적으로 16 진수 값과 연결된 0x를 생략 할 수 있습니다. 주 : sectionname , 등호 (`` = '') 및 org 사이에는 공백이 없어야합니다.

-TBss org

- 데이터 조직

-Text org

org 를 시작 파일로 사용하십시오 --- 각각 --- 출력 파일의 "bss", "data"또는 "text"세그먼트. org 는 단일 한 16 진수 여야합니다. 다른 링커와의 호환성을 위해 일반적으로 16 진수 값과 연결된 0x를 생략 할 수 있습니다.

--dll-verbose

--말 수가 많은

ld 의 버전 번호를 표시하고 지원되는 링커 에뮬레이션을 나열하십시오. 어떤 입력 파일을 열 수 있는지 또는 열 수 없는지를 표시합니다. 링커에서 사용중인 링커 스크립트를 표시합니다.

--version-script = 버전 - 스크립트 파일

링커에 대한 버전 스크립트의 이름을 지정하십시오. 일반적으로 공유 라이브러리를 만들 때 생성되는 라이브러리의 버전 계층에 대한 추가 정보를 지정하는 데 사용됩니다. 이 옵션은 공유 라이브러리를 지원하는 ELF 플랫폼에서만 의미가 있습니다.

- 워너 - 공통

공통 기호가 다른 공통 기호 또는 기호 정의와 결합 될 때 경고합니다. 유닉스 링커는이 방법이 다소 엉성함을 허용하지만, 다른 운영체제의 링커는 그렇지 않다. 이 옵션을 사용하면 전역 심볼을 조합하여 잠재적 인 문제를 찾을 수 있습니다. 불행히도 일부 C 라이브러리는이 방법을 사용하므로 라이브러리와 프로그램의 심볼에 대한 경고가 표시 될 수 있습니다.

여기에 C 예제로 나타낸 세 가지 종류의 전역 기호가 있습니다.

int i = 1;

정의 : 출력 파일의 초기화 된 데이터 섹션에 들어갑니다.

extern int i;

공간을 할당하지 않는 정의되지 않은 참조입니다. 변수에 대한 정의 또는 공통 기호가 있어야합니다.

int i;

일반적인 기호. 변수에 대해 (하나 이상의) 공통 기호 만 있으면 출력 파일의 초기화되지 않은 데이터 영역으로 이동합니다. 링커는 동일한 변수에 대한 여러 일반 기호를 단일 기호로 병합합니다. 크기가 다른 경우 가장 큰 크기를 선택합니다. 링커는 동일한 변수에 대한 정의가있는 경우 공통 심볼을 선언으로 바꿉니다.

--warn-common 옵션은 5 가지 종류의 경고를 생성 할 수 있습니다. 각 경고는 한 쌍의 줄로 구성되어 있습니다. 첫 번째 줄은 방금 만난 기호를 설명하고 두 번째 줄은 같은 이름으로 발견 된 이전 기호를 설명합니다. 두 기호 중 하나 또는 둘 모두가 공통 기호입니다.

1.

심볼에 대한 정의가 이미 있으므로 공통 심볼을 참조로 변환합니다.

(
) : 경고 : 정의에 의해 재정의 된 의 공통점 (
) : 경고 : 여기에 정의 됨

2.

심볼에 대한 나중 정의가 발생하기 때문에 공통 심볼을 참조로 변환합니다. 기호가 다른 순서로 발생한다는 점을 제외하면 앞의 경우와 같습니다.

(
) : 경고 : 일반적인 (
)을 오버라이드하는` '의 정의 : 경고 : common은 여기에있다.

삼.

공통 심볼을 이전 크기의 공통 심볼과 병합합니다.

(
) : 경고 : 여러 개의 '' (
) : 경고 : 이전 공통점은 여기

4.

공통 심볼을 이전의 더 큰 공통 심볼과 병합합니다.

(
) : 경고 : 더 큰 공통 (
)으로 덮어 쓰여진` '의 공통점 : 경고 : 더 큰 공통점은 여기에 있습니다.

5.

공통 기호를 이전보다 작은 공통 기호와 병합합니다. 기호가 다른 순서로 발생한다는 점을 제외하면 앞의 경우와 같습니다.

(
) : 경고 :보다 일반적인 (
)을 오버라이드하는` '의 공통점 : 경고 : 더 작은 공통점은 여기에있다.

--warn-constructors

글로벌 생성자가 사용되는 경우 경고합니다. 이것은 몇 가지 객체 파일 형식에만 유용합니다. COFF 또는 ELF와 같은 형식의 경우 링커에서 전역 생성자를 감지 할 수 없습니다.

--warn-multiple-gp

출력 파일 에 여러 개의 전역 포인터 값이 필요한 경우 경고 합니다 . 이것은 알파와 같은 특정 프로세서에서만 의미가 있습니다. 특히, 일부 프로세서는 특수 섹션에 큰 값의 상수를 넣습니다. 특수 레지스터 (전역 포인터)는이 섹션의 중간을 가리키므로 상수는 기본 레지스터 상대 주소 지정 모드를 통해 효율적으로로드 될 수 있습니다. 베이스 레지스터 상대 모드의 오프셋은 고정되어 비교적 작기 때문에 (예 : 16 비트), 이는 상수 풀의 최대 크기를 제한합니다. 따라서 큰 프로그램에서는 가능한 모든 상수를 처리 할 수 ​​있도록 여러 개의 전역 포인터 값을 사용해야하는 경우가 종종 있습니다. 이 옵션은이 경우마다 경고를 발행합니다.

- 번 - 한 번

정의되지 않은 각 심볼에 대해 한 번만 경고합니다. 모듈을 참조하는 모듈 당 한 번만 경고합니다.

--warn-section-align

정렬 때문에 출력 섹션의 주소가 변경되면 경고합니다. 일반적으로 정렬은 입력 섹션에 의해 설정됩니다. 주소는 명시 적으로 지정되지 않은 경우에만 변경됩니다. 즉, "SECTIONS"명령이 섹션의 시작 주소를 지정하지 않은 경우.

- 전체 - 아카이브

--whole-archive 옵션 다음에 명령 행에 언급 된 각 아카이브에 대해 아카이브에 필요한 오브젝트 파일을 검색하지 않고 아카이브에있는 모든 오브젝트 파일을 링크에 포함하십시오. 이것은 일반적으로 아카이브 파일을 공유 라이브러리로 변환하여 모든 오브젝트를 결과 공유 라이브러리에 포함시키는 데 사용됩니다. 이 옵션은 두 번 이상 사용될 수 있습니다.

gcc에서이 옵션을 사용할 때 두 가지주의 사항 : 먼저 gcc는이 옵션에 대해 알지 못하므로 -Wl, -whole-archive 를 사용해야합니다. 둘째, 아카이브 목록 뒤에 -Wl, -no-whole-archive 를 사용하는 것을 잊지 마십시오. gcc가 자신의 링크 목록을 자신의 링크에 추가하기 때문에이 플래그가 해당 플래그에도 영향을 미치기를 원하지 않을 수 있습니다.

- 포장 기호

기호에 래퍼 함수를 ​​사용하십시오. 심볼에 대한 정의되지 않은 참조는 "__ wrap_symbol"로 해석됩니다. "__real_symbol"에 대한 정의되지 않은 참조는 기호 로 해석됩니다.

이것은 시스템 기능에 대한 랩퍼를 제공하는 데 사용될 수 있습니다. 래퍼 함수는 "__wrap_symbol"이라고해야합니다. 시스템 기능을 호출하려면 "__ real_symbol"을 호출해야합니다.

다음은 간단한 예입니다.

void * __wrap_malloc (int c) {printf ( "% ld와 (과) 호출 된 malloc \ n", c); return __real_malloc (c); }

--wrap malloc을 사용하여이 파일과 다른 코드를 연결하면 "malloc"에 대한 모든 호출이 대신 "__wrap_malloc"함수를 호출합니다. "__wrap_malloc"에서 "__real_malloc"을 호출하면 실제 "malloc"함수가 호출됩니다.

--wrap 옵션이없는 링크가 성공할 수 있도록 "__real_malloc"함수도 제공 할 수 있습니다. 이렇게하면 "__ real_malloc"의 정의를 "__wrap_malloc"과 같은 파일에두면 안됩니다. 그렇게하면 어셈블러에서 링커가 "malloc"에 래핑 할 기회를 갖기 전에 호출을 해결할 수 있습니다.

--enable-new-dtags

--disable-new-dtags

이 링커는 ELF에서 새 동적 태그를 만들 수 있습니다. 그러나 오래된 ELF 시스템은이를 이해하지 못할 수도 있습니다. --enable-new-dtags 를 지정하면 필요에 따라 동적 태그가 만들어집니다. --disable-new-dtags 를 지정하면 새로운 동적 태그가 생성되지 않습니다. 기본적으로 새로운 동적 태그는 생성되지 않습니다. 이러한 옵션은 ELF 시스템에서만 사용할 수 있습니다.

i386 PE 링커는 -shared 옵션을 지원하므로 출력을 일반 실행 파일 대신 동적으로 링크 된 라이브러리 (DLL)로 만듭니다. 이 옵션을 사용하면 "* .dll"출력의 이름을 지정해야합니다. 또한 링커는 오브젝트 파일과 같이 링커 명령 행에 지정할 수있는 표준 "* .def"파일을 완벽하게 지원합니다 (사실 심볼을 내보내는 아카이브 앞에 있어야하며 링크가 생성되도록해야합니다. 일반 오브젝트 파일과 동일).

모든 대상에 공통적 인 옵션 외에도 i386 PE 링커는 i386 PE 대상과 관련된 추가 명령 행 옵션을 지원합니다. 값을 취하는 옵션은 공백이나 등호에 의해 값과 분리 될 수 있습니다.

--add-stdcall-alias

주어진 경우 stdcall 접미사 (@ nn )가있는 기호는있는 그대로 내보내고 접미어는 제거합니다.

--base-file 파일

dlltool로 DLL을 생성하는 데 필요한 모든 재배치의 기본 주소를 저장할 파일의 이름으로 file 을 사용하십시오.

--dll

일반 실행 파일 대신 DLL을 만듭니다. 주어진 ".def"파일에서 -shared 를 사용하거나 "LIBRARY"를 지정할 수도 있습니다.

--enable-stdcall-fixup

--disable-stdcall-fixup

링크가 해결할 수없는 심볼을 발견하면 심볼 이름의 형식 (cdecl 대 stdcall) 만 다른 정의 된 심볼을 찾아서 링크를 통해 해당 심볼을 확인함으로써 "퍼지 링크"를 시도합니다 경기에. 예를 들어, 정의되지 않은 기호 "_foo"는 함수 "_foo @ 12"에 링크되거나 정의되지 않은 기호 "_bar @ 16"은 함수 "_bar"에 링크 될 수 있습니다. 링커에서는이 작업을 수행 할 때 일반적으로 연결하지 않아야하므로 경고를 인쇄하지만 타사 DLL에서 생성 된 라이브러리를 가져 오는 경우이 기능이 필요할 수 있습니다. --enable-stdcall-fixup 을 지정하면이 기능이 완전히 활성화되고 경고가 인쇄되지 않습니다. --disable-stdcall-fixup 을 지정하면이 기능은 비활성화되고 이러한 불일치는 오류로 간주됩니다.

--export-all-symbols

주어진 경우 DLL을 만드는 데 사용 된 개체의 모든 전역 기호가 DLL에서 내보내집니다. 그렇지 않으면 내보낼 기호가없는 경우 기본값입니다. 심볼이 DEF 파일을 통해 명시 적으로 내보내거나 함수 속성을 통해 암시 적으로 내보내지는 경우이 옵션을 지정하지 않으면 기본값으로 다른 것을 내 보내지 않습니다. "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12"및 "impure_ptr"기호는 자동으로 내보내지지 않습니다. 또한 다른 DLL에서 가져온 기호는 다시 내보낼 수 없으며 "_head_"로 시작하거나 "_iname"로 끝나는 기호와 같은 DLL의 내부 레이아웃을 지정하는 기호도 표시되지 않습니다. 또한 "libgcc", "libstd ++", "libmingw32"또는 "crtX.o"의 기호는 내보낼 수 없습니다. 이름이 "__rtti_"또는 "__builtin_"로 시작되는 심볼은 C ++ DLL을 지원하기 위해 내보내지지 않습니다. 마지막으로, 내보낼 수없는 cygwin-private 기호의 광범위한 목록이 있습니다 (분명히 cygwin 대상에 대한 DLL을 빌드 할 때 적용됩니다).

이러한 cygwin 제외는 "_cygwin_dll_entry @ 12", "_cygwin_crt0_common @ 8", "_cygwin_noncygwin_dll_entry @ 12", "_fmode", "_impure_ptr", "cygwin_attach_dll", "cygwin_premain0", "cygwin_premain1", "cygwin_premain2", "cygwin_premain3" ","환경 ".

--exclude-symbols 기호 , 기호 , ...

자동으로 내보낼 수없는 기호 목록을 지정합니다. 기호 이름은 쉼표 또는 콜론으로 구분할 수 있습니다.

--exclude-libs lib , lib , ...

기호를 자동으로 반출하지 않아야하는 아카이브 라이브러리 목록을 지정합니다. 라이브러리 이름은 쉼표 또는 콜론으로 구분할 수 있습니다. "--exclude-libs ALL"을 지정하면 모든 아카이브 라이브러리의 기호가 자동 내보내기에서 제외됩니다. .def 파일에 명시 적으로 나열된 기호는이 옵션과 상관없이 여전히 내보내집니다.

- 파일 정렬

파일 정렬을 지정하십시오. 파일의 섹션은 항상이 숫자의 배수 인 파일 오프셋에서 시작합니다. 기본값은 512입니다.

- 예탁금

- 예열하다

이 프로그램의 힙으로 사용할 메모리의 양을 지정하십시오 (선택적으로 커밋 할 수도 있음). 기본값은 1Mb 예약이고, 4K는 확약입니다.

- 이미지 - 기준

을 프로그램이나 dll의 기본 주소로 사용하십시오. 이것은 프로그램이나 dll이로드 될 때 사용되는 가장 낮은 메모리 위치입니다. 재배치하고 dll의 성능을 향상시킬 필요성을 줄이려면 각각 고유 한 기본 주소가 있어야하며 다른 dll과 겹치지 않아야합니다. 기본값은 실행 파일의 경우 0x400000이고 dll의 경우 0x10000000입니다.

- 죽여라.

주어진 경우 stdcall 접 L 부 (@ nn )는 기호를 내보내 기 전에 기호에서 제거됩니다.

--major-image-version

``이미지 버전 ''의 주요 번호를 설정합니다. 기본값은 1입니다.

--major-os-version

``os version ''의 주요 번호를 설정합니다. 기본값은 4입니다.

--major-subsystem-version

``서브 시스템 버전 ''의 주요 번호를 설정합니다. 기본값은 4입니다.

--minor-image-version

``이미지 버전 ''의 부 번호를 설정합니다. 기본값은 0입니다.

--minor-os-version

``os version ''의 부 번호를 설정합니다. 기본값은 0입니다.

--minor-subsystem-version

서브 시스템 버젼의 마이너 번호를 설정합니다. 기본값은 0입니다.

--output-def 파일

링커는 링커에서 생성하는 DLL에 해당하는 DEF 파일을 포함하는 파일 파일 을 만듭니다. 이 DEF 파일 ( "* .def"라고해야 함)은 "dlltool"을 사용하여 가져 오기 라이브러리를 만드는 데 사용되거나 자동 또는 암시 적으로 내 보낸 심볼에 대한 참조로 사용될 수 있습니다.

--out-implib 파일

링커는 링커가 생성하는 DLL에 해당하는 가져 오기 lib가 포함 된 파일 을 만듭니다. 이 가져 오기 lib ( "* .dll.a"또는 "* .a"라고해야 함)는 생성 된 DLL에 대해 클라이언트를 연결하는 데 사용될 수 있으며이 동작으로 인해 별도의 "dlltool"가져 오기 라이브러리 만들기 단계를 건너 뛸 수 있습니다.

- 가능 - 자동 이미지베이스

"--image-base"인수를 사용하여 지정하지 않으면 자동으로 DLL의 이미지 기반을 선택합니다. dllname에서 생성 된 해시를 사용하여 각 DLL에 고유 한 이미지베이스를 생성하면 프로그램 실행을 지연시킬 수있는 메모리 충돌 및 재배치가 방지됩니다.

--disable-auto-image-base

고유 한 이미지 기반을 자동으로 생성하지 마십시오. 사용자 지정 이미지베이스 ( "--image-base")가없는 경우 플랫폼 기본값을 사용하십시오.

--dll-search-prefix 문자열

가져 오기 라이브러리없이 dll에 동적으로 링크 할 때 "lib .dll"보다 " .dll"을 검색하십시오. 이 동작은 다양한``서브 플랫폼 (subplatforms) ': 네이티브, cygwin, uwin, pw 등을 위해 빌드 된 DLL을 쉽게 구분할 수있게합니다. 예를 들어 cygwin DLL은 일반적으로 "--dll-search-prefix = cyg"를 사용합니다.

- enable-auto-import

DLL에서 DATA에 대해 "_symbol"과 "__imp__symbol"을 정교하게 연결하고 해당 DATAexports로 가져 오기 라이브러리를 작성할 때 필요한 썽킹 기호를 만듭니다. 이것은 일반적으로 '효과가 있습니다'---하지만 때로는 다음 메시지가 표시 될 수 있습니다.

"변수 ''는 자동으로 가져올 수 없습니다. 자세한 내용은 ld의"- enable-auto-import "문서를 읽어보십시오."

이 메시지는 일부 (하위) 표현식이 궁극적으로 두 개의 상수 합계로 주어진 주소에 액세스 할 때 발생합니다 (Win32 가져 오기 테이블은 하나만 허용). 이 문제가 발생할 수있는 인스턴스에는 DLL에서 가져온 구조체 변수의 멤버 필드에 대한 액세스뿐 아니라 DLL에서 가져온 배열 변수에 상수 인덱스를 사용하는 것도 포함됩니다. 모든 다중 단어 변수 (배열, 구조체, long long 등)가이 오류 조건을 유발할 수 있습니다. 그러나 문제가있는 내 보낸 변수의 정확한 데이터 유형에 관계없이 ld는 항상 해당 변수를 감지하고 경고를 발행 한 다음 종료합니다.

내 보낸 변수의 데이터 유형에 관계없이 이러한 어려움을 해결할 수있는 몇 가지 방법이 있습니다.

한 가지 방법은 - enable-runtime-pseudo-reloc 스위치를 사용하는 것입니다. 이는 런타임 환경에 대한 클라이언트 코드에서 참조를 조정하는 작업을 남겨 둡니다. 따라서이 방법은 런타임 환경이이 기능을 지원하는 경우에만 작동합니다.

두 번째 해결책은 '상수'중 하나를 변수가되도록 강제하는 것입니다. 즉 컴파일 타임에 알려지지 않고 최적화되지 않습니다. 배열의 경우 두 가지 가능성이 있습니다. a) 색인 대상 (배열의 주소)을 변수로 만들거나 b) '상수'색인을 변수로 만듭니다. 그러므로:

extern 형식 extern_array []; extern_array [1] -> {휘발성 유형 * t = extern_array; t [1]}

또는

extern 형식 extern_array []; extern_array [1] -> {volatile int t = 1; extern_array [t]}

구조체 (및 대부분의 다른 다중 단어 데이터 형식)의 경우 유일한 옵션은 구조체 자체 (또는 긴 long 또는 ...) 변수를 만드는 것입니다.

extern 구조체 extern_struct; extern_struct.field -> {휘발성 구조체 s * t = & extern_struct; t-> field}

또는

extern long long extern_ll; extern_ll -> {휘발성 긴 long * local_ll = & extern_ll; * local_ll}

이 어려움을 처리하는 세 번째 방법은 위반하는 심볼에 대해 '자동 가져 오기'를 포기하고 '__declspec (dllimport)'으로 표시하는 것입니다. 그러나 실제로는 컴파일 타임 #defines를 사용하여 DLL을 빌드하는지, DLL에 링크 할 클라이언트 코드를 작성하는지 또는 정적 라이브러리에 빌드 / 링크하는지를 나타낼 수 있어야합니다. '상수 오프셋과 함께 직접 주소 지정'문제를 해결하는 다양한 방법 중에서 선택을 할 때 실제 사용법을 고려해야합니다.

실물:

--foo.h extern int arr []; --foo.c #include "foo.h"void main (int argc, char ** argv) {printf ( "% d \ n", arr [1]); }

해결책 1 :

--foo.h extern int arr []; --foo.c #include "foo.h"void main (int argc, char ** argv) {/ *이 해결 방법은 win32와 cygwin을위한 것입니다. "최적화"하지 마라. * / volatile int * parr = arr; printf ( "% d \ n", parr [1]); }

해결책 2 :

(FOO_BUILD_DLL) || 정의 된 (FOO_STATIC (FOO_BUILD_DLL)) 정의 된 (_WIN32) 정의 된 (__CYGWIN__)) && \! )) #define FOO_IMPORT __declspec (dllimport) #else #define FOO_IMPORT #endif extern FOO_IMPORT int arr []; --foo.c #include "foo.h"void main (int argc, char ** argv) {printf ( "% d \ n", arr [1]); }

이 문제를 피하는 네 번째 방법은 잘못된 변수 (예 : set_foo ()get_foo () 접근 자 함수)에 대한 데이터 인터페이스가 아닌 기능 인터페이스를 사용하도록 라이브러리를 다시 코딩하는 것입니다.

--disable-auto-import

DLL에서 DATAimports에 대해 "_symbol"과 "__imp__symbol"의 정교한 연결을 시도하지 마십시오.

- enable-runtime-pseudo-reloc

코드에 --enable-auto-import 섹션에 설명 된 표현식이 포함되어 있으면 (즉, 오프셋이 0 인 DLL의 DATAimports)이 스위치는 런타임 환경에서 참조를 조정하는 데 사용할 수있는 '런타임 의사 재배치'벡터를 생성합니다 클라이언트 코드의 해당 데이터에 적용됩니다.

--disable-runtime-pseudo-reloc

DLL에서 0이 아닌 오프셋 DATA 가져 오기에 대한 의사 재배치를 만들지 마십시오. 이것이 기본값입니다.

--enable-extra-pe-debug

자동 가져 오기 심볼 썽킹과 관련된 추가 디버그 정보를 표시합니다.

- 섹션 정렬

섹션 맞춤을 설정합니다. 메모리의 섹션은 항상이 번호의 배수 인 주소에서 시작합니다. 기본값은 0x1000입니다.

- 예비 선적

--stack 예약 , 커밋

이 프로그램의 스택으로 사용할 메모리의 양을 지정합니다 (선택적으로 커밋 할 수도 있음). 기본값은 예약 된 2MB, 4K가 확약 된 것입니다.

- 서브 시스템

- 하위 시스템 : 주요

- 서브 시스템 : 메이저 . 미성년자

프로그램이 실행될 하위 시스템을 지정합니다. 유효한 값은 "기본", "창", "콘솔"및 "posix"입니다. 선택적으로 서브 시스템 버전을 설정할 수도 있습니다.

중요 : man 명령 ( % man )을 사용하여 특정 컴퓨터에서 명령이 어떻게 사용되는지보십시오.