Lệnh Linux / Unix: Id

TÊN

ld - Sử dụng LD , trình liên kết GNU

TÓM TẮC

ld [ tùy chọn ] objfile ...

SỰ MIÊU TẢ

ld kết hợp một số đối tượng và các tệp lưu trữ, di chuyển dữ liệu của chúng và liên kết các tham chiếu biểu tượng. Thông thường bước cuối cùng trong việc biên dịch một chương trình là chạy ld .

ld chấp nhận các tệp ngôn ngữ lệnh của Linker được viết trong phần siêu lớn của cú pháp Liên kết lệnh của trình soạn thảo liên kết của AT & T, để cung cấp kiểm soát rõ ràng và toàn bộ quá trình liên kết.

Trang người đàn ông này không mô tả ngôn ngữ lệnh; xem mục ld trong "info", hoặc ld: linker GNU , để biết đầy đủ chi tiết về ngôn ngữ lệnh và các khía cạnh khác của liên kết GNU.

Phiên bản này của ld sử dụng các thư viện BFD mục đích chung để hoạt động trên các tệp đối tượng. Điều này cho phép ld đọc, kết hợp và ghi các tệp đối tượng theo nhiều định dạng khác nhau --- ví dụ: COFF hoặc "a.out". Các định dạng khác nhau có thể được liên kết với nhau để tạo ra bất kỳ loại tệp đối tượng có sẵn nào.

Bên cạnh tính linh hoạt của nó, trình liên kết GNU hữu ích hơn các trình liên kết khác trong việc cung cấp thông tin chẩn đoán. Nhiều người liên kết từ bỏ thực hiện ngay lập tức khi gặp lỗi; bất cứ khi nào có thể, ld tiếp tục thực hiện, cho phép bạn xác định các lỗi khác (hoặc, trong một số trường hợp, để có được một tệp đầu ra bất chấp lỗi).

Trình liên kết GNU ld có nghĩa là bao quát một loạt các tình huống, và tương thích nhất có thể với các trình liên kết khác. Kết quả là, bạn có nhiều lựa chọn để kiểm soát hành vi của nó.

TÙY CHỌN

Trình liên kết hỗ trợ rất nhiều tùy chọn dòng lệnh , nhưng trong thực tế, một vài trong số chúng được sử dụng trong bất kỳ ngữ cảnh cụ thể nào. Ví dụ, việc sử dụng thường xuyên ld là liên kết các tệp đối tượng Unix chuẩn trên một hệ thống Unix chuẩn, được hỗ trợ. Trên một hệ thống như vậy, để liên kết một tệp "hello.o":

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

Điều này cho phép ld tạo ra một tệp được gọi là kết quả của việc nối kết tệp "/lib/crt0.o" với "hello.o" và thư viện "libc.a", sẽ xuất phát từ các thư mục tìm kiếm chuẩn. (Xem thảo luận về tùy chọn -l bên dưới.)

Một số tùy chọn dòng lệnh để ld có thể được chỉ định tại bất kỳ điểm nào trong dòng lệnh. Tuy nhiên, các tùy chọn tham chiếu đến các tệp, chẳng hạn như -l hoặc -T , làm cho tệp được đọc tại thời điểm tùy chọn xuất hiện trong dòng lệnh, liên quan đến các tệp đối tượng và các tùy chọn tệp khác. Việc lặp lại các tùy chọn không phải tập tin với một đối số khác sẽ không có hiệu ứng nào khác, hoặc ghi đè các lần xuất hiện trước đó (những điều xa hơn về bên trái trên dòng lệnh) của tùy chọn đó. Các tùy chọn có thể được chỉ định một cách có ý nghĩa nhiều lần được ghi chú trong phần mô tả bên dưới.

Đối số không tùy chọn là các tệp đối tượng hoặc các tệp lưu trữ được liên kết với nhau. Họ có thể làm theo, đứng trước, hoặc được trộn lẫn với các tùy chọn dòng lệnh, ngoại trừ một đối số tập tin đối tượng có thể không được đặt giữa một tùy chọn và đối số của nó.

Thông thường, trình liên kết được gọi với ít nhất một tệp đối tượng, nhưng bạn có thể chỉ định các dạng tệp đầu vào nhị phân khác sử dụng -l , -R và ngôn ngữ lệnh kịch bản lệnh. Nếu không có tệp đầu vào nhị phân nào được chỉ định, trình liên kết không tạo ra bất kỳ đầu ra nào và phát ra thông báo Không có tệp đầu vào nào .

Nếu trình liên kết không thể nhận ra định dạng của một tệp đối tượng, nó sẽ giả định rằng nó là một tập lệnh liên kết. Một kịch bản được chỉ rõ theo cách này sẽ bổ sung kịch bản liên kết chính được sử dụng cho liên kết (hoặc tập lệnh trình liên kết mặc định hoặc tập lệnh được chỉ định bằng cách sử dụng -T ). Tính năng này cho phép liên kết liên kết với một tệp có vẻ là một đối tượng hoặc một tệp lưu trữ, nhưng thực sự chỉ xác định một số giá trị biểu tượng hoặc sử dụng "INPUT" hoặc "GROUP" để tải các đối tượng khác. Lưu ý rằng việc chỉ định một tập lệnh theo cách này chỉ đơn thuần là bổ sung kịch bản liên kết chính; sử dụng tùy chọn -T để thay thế hoàn toàn tập lệnh trình liên kết mặc định.

Đối với các tùy chọn có tên là một chữ cái duy nhất, các đối số tùy chọn phải tuân thủ tùy chọn thư mà không can thiệp khoảng trống hoặc được đưa ra dưới dạng đối số riêng ngay sau tùy chọn yêu cầu chúng.

Đối với các tùy chọn có tên là nhiều chữ cái, một hoặc hai dấu gạch ngang có thể đứng trước tên tùy chọn; ví dụ, -trace-symbol--trace-symbol là tương đương. Lưu ý - có một ngoại lệ đối với quy tắc này. Nhiều tùy chọn chữ cái bắt đầu bằng chữ thường 'o' chỉ có thể được đặt trước bởi hai dấu gạch ngang. Điều này là để giảm sự nhầm lẫn với tùy chọn -o . Vì vậy, ví dụ -omagic đặt tên tệp đầu ra thành ma thuật trong khi --omagic đặt cờ NMAGIC trên đầu ra.

Các đối số cho các tùy chọn nhiều chữ cái phải được tách biệt với tên tùy chọn bằng dấu bằng hoặc được cho dưới dạng đối số riêng ngay sau tùy chọn yêu cầu chúng. Ví dụ: - biểu tượng -trace-foo--trace-symbol = foo tương đương nhau. Chữ viết tắt duy nhất của tên của các tùy chọn nhiều chữ cái được chấp nhận.

Lưu ý - nếu trình liên kết được gọi gián tiếp, thông qua trình điều khiển trình biên dịch (ví dụ gcc ) thì tất cả các tùy chọn dòng lệnh liên kết phải được tiền tố -Wl, (hoặc bất kỳ điều gì thích hợp cho trình điều khiển trình biên dịch cụ thể) như sau:

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

Điều này là quan trọng, bởi vì nếu không chương trình trình điều khiển trình biên dịch có thể âm thầm thả các tùy chọn liên kết, dẫn đến một liên kết xấu.

Đây là một bảng các công tắc dòng lệnh chung được chấp nhận bởi trình liên kết GNU:

-từ khóa

Tùy chọn này được hỗ trợ cho khả năng tương thích HP / UX. Đối số từ khóa phải là một trong các lưu trữ , chia sẻ hoặc mặc định của chuỗi . -aarchive có chức năng tương đương với -Bstatic , và hai từ khóa khác có chức năng tương đương với -Bdynamic . Tùy chọn này có thể được sử dụng bất kỳ số lần nào.

- Kiến trúc

- kiến trúc = kiến trúc

Trong bản phát hành hiện tại của ld , tùy chọn này chỉ hữu ích cho kiến ​​trúc Intel 960. Trong cấu hình ld đó, đối số kiến trúc xác định kiến ​​trúc cụ thể trong họ 960, cho phép một số biện pháp bảo vệ và sửa đổi đường dẫn tìm kiếm thư viện lưu trữ.

Các bản phát hành tương lai của ld có thể hỗ trợ chức năng tương tự cho các gia đình kiến ​​trúc khác.

-b định dạng đầu vào

--format = định dạng đầu vào

ld có thể được cấu hình để hỗ trợ nhiều hơn một loại tập tin đối tượng. Nếu ld của bạn được cấu hình theo cách này, bạn có thể sử dụng tùy chọn -b để chỉ định định dạng nhị phân cho các tệp đối tượng đầu vào theo tùy chọn này trên dòng lệnh. Ngay cả khi ld được cấu hình để hỗ trợ các định dạng đối tượng thay thế, bạn thường không cần phải xác định điều này, vì ld nên được cấu hình để mong đợi dưới dạng định dạng đầu vào mặc định định dạng thông thường nhất trên mỗi máy. định dạng đầu vào là một chuỗi văn bản, tên của một định dạng cụ thể được hỗ trợ bởi các thư viện BFD. (Bạn có thể liệt kê các định dạng nhị phân có sẵn với objdump -i .)

Bạn có thể muốn sử dụng tùy chọn này nếu bạn đang liên kết tệp với định dạng nhị phân bất thường. Bạn cũng có thể sử dụng -b để chuyển đổi các định dạng một cách rõ ràng (khi liên kết các tệp đối tượng của các định dạng khác nhau), bằng cách bao gồm -b -định dạng đầu vào trước mỗi nhóm tệp đối tượng theo một định dạng cụ thể.

Định dạng mặc định được lấy từ biến môi trường "GNUTARGET".

Bạn cũng có thể xác định định dạng đầu vào từ tập lệnh, sử dụng lệnh "TARGET";

-c -Ifile-commandfile

--mri-script = MRI-commandfile

Để tương thích với các trình liên kết được tạo bởi MRI, ld chấp nhận các tệp kịch bản được viết bằng ngôn ngữ lệnh thay thế, bị hạn chế, được mô tả trong phần Tệp tương thích MRI của tài liệu GNU ld. Giới thiệu các tệp kịch bản lệnh MRI với tùy chọn -c ; sử dụng tùy chọn -T để chạy các tập lệnh liên kết được viết bằng ngôn ngữ kịch bản lệnh ld chung. Nếu MRI-cmdfile không tồn tại, ld tìm kiếm nó trong các thư mục được chỉ định bởi bất kỳ tùy chọn -L nào.

-d

-dc

-dp

Ba tùy chọn này là tương đương; nhiều biểu mẫu được hỗ trợ để tương thích với các trình liên kết khác. Chúng gán khoảng trống cho các ký hiệu chung ngay cả khi một tệp đầu ra có thể định vị lại được xác định (với -r ). Lệnh tập lệnh "FORCE_COMMON_ALLOCATION" có cùng tác dụng.

-nhập vào

--entry = entry

Sử dụng mục nhập làm biểu tượng rõ ràng để bắt đầu thực hiện chương trình của bạn, thay vì nhập điểm mặc định. Nếu không có ký hiệu có tên là entry , linker sẽ cố gắng phân tích entry như một số, và sử dụng nó làm địa chỉ entry (số sẽ được diễn giải trong base 10, bạn có thể sử dụng 0x hàng đầu cho base 16, hoặc 0 hàng đầu cho cơ số 8).

-E

--nhập động

Khi tạo một tệp thực thi được liên kết động, hãy thêm tất cả ký hiệu vào bảng ký hiệu động. Bảng ký hiệu động là tập hợp các ký hiệu có thể nhìn thấy được từ các đối tượng động trong thời gian chạy.

Nếu bạn không sử dụng tùy chọn này, bảng ký hiệu động thường sẽ chỉ chứa các biểu tượng được tham chiếu bởi một số đối tượng động được đề cập trong liên kết.

Nếu bạn sử dụng "dlopen" để tải một đối tượng động cần tham chiếu lại các biểu tượng được chương trình xác định, thay vì một số đối tượng động khác, thì có thể bạn sẽ cần sử dụng tùy chọn này khi liên kết chính chương trình.

Bạn cũng có thể sử dụng tập lệnh phiên bản để kiểm soát những biểu tượng nào sẽ được thêm vào bảng ký hiệu động nếu định dạng đầu ra hỗ trợ nó. Xem mô tả về --version-script trong @ ref {VERSION}.

-EB

Liên kết các đối tượng lớn. Điều này ảnh hưởng đến định dạng đầu ra mặc định.

-EL

Liên kết các đối tượng nhỏ. Điều này ảnh hưởng đến định dạng đầu ra mặc định.

-f

- tên đường hầm

Khi tạo một đối tượng chia sẻ ELF, hãy đặt trường DT_AUXILIARY nội bộ thành tên được chỉ định. Điều này cho biết mối liên kết động mà bảng biểu tượng của đối tượng được chia sẻ nên được sử dụng như một bộ lọc phụ trợ trên bảng biểu tượng của tên đối tượng được chia sẻ.

Nếu sau này bạn liên kết một chương trình với đối tượng bộ lọc này, thì khi bạn chạy chương trình, trình liên kết động sẽ thấy trường DT_AUXILIARY. Nếu trình liên kết động giải quyết bất kỳ ký hiệu nào từ đối tượng bộ lọc, trước tiên nó sẽ kiểm tra xem có một định nghĩa trong tên đối tượng được chia sẻ hay không. Nếu có, nó sẽ được sử dụng thay vì định nghĩa trong đối tượng bộ lọc. Tên đối tượng được chia sẻ không cần tồn tại. Do đó, tên đối tượng dùng chung có thể được sử dụng để cung cấp một cách thực hiện thay thế các chức năng nhất định, có lẽ để gỡ lỗi hoặc cho hiệu suất máy cụ thể.

Tùy chọn này có thể được chỉ định nhiều lần. Các mục DT_AUXILIARY sẽ được tạo theo thứ tự xuất hiện trên dòng lệnh.

-Tên

- tên bộ lọc

Khi tạo một đối tượng chia sẻ ELF, hãy đặt trường DT_FILTER bên trong thành tên được chỉ định. Điều này cho biết liên kết động mà bảng biểu tượng của đối tượng được chia sẻ đang được tạo nên được sử dụng như một bộ lọc trên bảng ký hiệu của tên đối tượng được chia sẻ.

Nếu sau này bạn liên kết một chương trình với đối tượng bộ lọc này thì khi bạn chạy chương trình, trình liên kết động sẽ thấy trường DT_FILTER. Trình liên kết động sẽ giải quyết các biểu tượng theo bảng biểu tượng của đối tượng bộ lọc như bình thường, nhưng nó sẽ thực sự liên kết đến các định nghĩa được tìm thấy trong tên đối tượng dùng chung. Do đó, đối tượng bộ lọc có thể được sử dụng để chọn một tập con của các biểu tượng được cung cấp bởi tên đối tượng.

Một số liên kết cũ hơn sử dụng tùy chọn -F trong suốt chuỗi công cụ biên dịch để xác định định dạng tệp đối tượng cho cả tệp đối tượng đầu vào và đầu ra. Trình liên kết GNU sử dụng các cơ chế khác cho mục đích này: các tùy chọn -b , --format , --oformat , lệnh "TARGET" trong các kịch bản liên kết và biến môi trường "GNUTARGET". Trình liên kết GNU sẽ bỏ qua tùy chọn -F khi không tạo đối tượng chia sẻ ELF.

-fini name

Khi tạo một đối tượng thực thi hoặc chia sẻ ELF, hãy gọi NAME khi đối tượng thực thi hoặc chia sẻ được dỡ bỏ, bằng cách đặt DT_FINI thành địa chỉ của hàm. Theo mặc định, trình liên kết sử dụng "_fini" làm hàm để gọi.

-g

Làm ngơ. Được cung cấp cho khả năng tương thích với các công cụ khác.

-giá trị G

--gpsize = value

Đặt kích thước tối đa của các đối tượng được tối ưu hóa bằng cách sử dụng GP đăng ký để kích thước . Điều này chỉ có ý nghĩa đối với các định dạng tệp đối tượng chẳng hạn như MIPS ECOFF hỗ trợ việc đặt các đối tượng lớn và nhỏ vào các phần khác nhau. Điều này bị bỏ qua đối với các định dạng tệp đối tượng khác.

-tên

-soname = name

Khi tạo một đối tượng được chia sẻ ELF, hãy đặt trường DT_SONAME nội bộ thành tên được chỉ định. Khi một tệp thực thi được liên kết với một đối tượng được chia sẻ có trường DT_SONAME, thì khi thực thi được chạy, trình liên kết động sẽ cố gắng tải đối tượng được chia sẻ được chỉ định bởi trường DT_SONAME thay vì sử dụng tên tệp được cung cấp cho trình liên kết.

-tôi

Thực hiện một liên kết gia tăng (giống như tùy chọn -r ).

-tên bắt đầu

Khi tạo một đối tượng thực thi hoặc chia sẻ ELF, hãy gọi NAME khi đối tượng thực thi hoặc được chia sẻ được nạp, bằng cách đặt DT_INIT thành địa chỉ của hàm. Theo mặc định, trình liên kết sử dụng "_init" làm hàm để gọi.

-l lưu trữ

--library = lưu trữ

Thêm lưu trữ tệp lưu trữ vào danh sách tệp để liên kết. Tùy chọn này có thể được sử dụng bất kỳ số lần nào. ld sẽ tìm kiếm danh sách đường dẫn của nó cho các lần xuất hiện của "libarchive.a" cho mọi lưu trữ được chỉ định.

Trên các hệ thống hỗ trợ thư viện được chia sẻ, ld cũng có thể tìm kiếm các thư viện có phần mở rộng khác với ".a". Cụ thể, trên hệ thống ELF và SunOS, ld sẽ tìm kiếm thư mục cho thư viện có phần mở rộng là ".so" trước khi tìm kiếm thư mục có phần mở rộng là ".a". Theo quy ước, tiện ích ".so" cho biết thư viện được chia sẻ.

Trình liên kết sẽ tìm kiếm một bản lưu trữ chỉ một lần, tại vị trí mà nó được chỉ định trên dòng lệnh. Nếu kho lưu trữ định nghĩa một biểu tượng không xác định trong một số đối tượng xuất hiện trước khi lưu trữ trên dòng lệnh, trình liên kết sẽ bao gồm (các) tệp thích hợp từ tệp lưu trữ. Tuy nhiên, một biểu tượng không xác định trong một đối tượng xuất hiện sau này trên dòng lệnh sẽ không làm cho trình liên kết tìm kiếm kho lưu trữ một lần nữa.

Xem tùy chọn - ( một cách để buộc trình liên kết tìm kiếm lưu trữ nhiều lần.

Bạn có thể liệt kê cùng một kho lưu trữ nhiều lần trên dòng lệnh.

Loại tìm kiếm lưu trữ này là tiêu chuẩn cho các trình liên kết Unix. Tuy nhiên, nếu bạn đang sử dụng ld onAIX, lưu ý rằng nó khác với hành vi của trình liên kết AIX.

-L searchdir

--library-path = searchdir

Thêm searchdir đường dẫn vào danh sách các đường dẫn mà ld sẽ tìm kiếm các thư viện lưu trữ và các kịch bản lệnh kiểm soát ld . Bạn có thể sử dụng tùy chọn này bất kỳ số lần nào. Các thư mục được tìm kiếm theo thứ tự mà chúng được chỉ định trên dòng lệnh. Các thư mục được chỉ định trên dòng lệnh được tìm kiếm trước các thư mục mặc định. Tất cả các tùy chọn -L áp dụng cho tất cả các tùy chọn -l , bất kể thứ tự các tùy chọn xuất hiện.

Nếu searchdir bắt đầu bằng "=", thì "=" sẽ được thay thế bằng tiền tố sysroot , một đường dẫn được chỉ định khi trình liên kết được định cấu hình.

Tập hợp các đường dẫn mặc định được tìm kiếm (không được chỉ định bằng -L ) phụ thuộc vào chế độ mô phỏng mà ld đang sử dụng, và trong một số trường hợp cũng được thiết lập về cách nó được cấu hình.

Các đường dẫn cũng có thể được chỉ định trong một tập lệnh liên kết với lệnh "SEARCH_DIR". Các thư mục được chỉ định theo cách này được tìm kiếm tại điểm mà trong đó tập lệnh trình liên kết xuất hiện trong dòng lệnh.

-m mô phỏng

phỏng trình liên kết mô phỏng . Bạn có thể liệt kê các mô phỏng có sẵn với các tùy chọn --verbose hoặc -V .

Nếu tùy chọn -m không được sử dụng, mô phỏng được lấy từ biến môi trường "LDEMULATION", nếu nó được định nghĩa.

Nếu không, mô phỏng mặc định phụ thuộc vào cách trình liên kết được cấu hình.

-M

--print-map

In một bản đồ liên kết đến đầu ra tiêu chuẩn. Bản đồ liên kết cung cấp thông tin về liên kết, bao gồm:

*

Nơi các tệp đối tượng và biểu tượng được ánh xạ vào bộ nhớ.

*

Cách phân bổ các biểu tượng phổ biến.

*

Tất cả các thành viên lưu trữ được bao gồm trong liên kết, với đề cập đến biểu tượng đã khiến thành viên lưu trữ được đưa vào.

-n

--nmagic

Tắt liên kết trang của các phần và đánh dấu đầu ra là "NMAGIC" nếu có thể.

-N

--omagic

Đặt các phần văn bản và dữ liệu để có thể đọc và ghi được. Ngoài ra, không điều chỉnh trang phân đoạn dữ liệu và vô hiệu hóa liên kết với các thư viện được chia sẻ. Nếu định dạng đầu ra hỗ trợ các số ma thuật kiểu Unix, hãy đánh dấu đầu ra là "OMAGIC".

--no-omagic

Tùy chọn này phủ nhận hầu hết các hiệu ứng của tùy chọn -N . Nó đặt phần văn bản thành chỉ đọc và buộc phân đoạn dữ liệu được căn chỉnh theo trang. Lưu ý - tùy chọn này không cho phép liên kết với các thư viện được chia sẻ. Sử dụng -Bdynamic cho việc này.

-kết quả đầu ra

--output = output

Sử dụng đầu ra làm tên cho chương trình được tạo bởi ld ; nếu tùy chọn này không được chỉ định, tên a.out được sử dụng theo mặc định. Lệnh kịch bản "OUTPUT" cũng có thể chỉ định tên tệp đầu ra.

-O cấp

Nếu mức là một giá trị số lớn hơn 0 thì tối ưu hóa đầu ra. Điều này có thể mất nhiều thời gian hơn và do đó có lẽ chỉ nên được kích hoạt cho nhị phân cuối cùng.

-q

--emit-relocs

Để lại các phần và nội dung di dời trong các tập thi hành được liên kết đầy đủ. Các công cụ phân tích và tối ưu hóa liên kết bài đăng có thể cần thông tin này để thực hiện sửa đổi chính xác các tệp thi hành. Điều này dẫn đến thực thi lớn hơn.

Tùy chọn này hiện chỉ được hỗ trợ trên nền tảng ELF.

-r

- có thể thay đổi

Tạo đầu ra relocatable --- tức là, tạo ra một tập tin đầu ra có thể lần lượt phục vụ như đầu vào để ld . Điều này thường được gọi là liên kết một phần . Là một tác dụng phụ, trong các môi trường hỗ trợ các số ma thuật Unix chuẩn, tùy chọn này cũng đặt số ma thuật của tệp đầu ra thành "OMAGIC". Nếu tùy chọn này không được chỉ định, một tệp tuyệt đối được tạo. Khi liên kết các chương trình C ++, tùy chọn này sẽ không giải quyết các tham chiếu tới các hàm tạo; để làm điều đó, sử dụng -Ur .

Khi tệp đầu vào không có định dạng giống như tệp đầu ra, liên kết một phần chỉ được hỗ trợ nếu tệp đầu vào đó không chứa bất kỳ chuyển vị trí nào. Các định dạng đầu ra khác nhau có thể có các hạn chế khác; ví dụ một số định dạng dựa trên "a.out" không hỗ trợ liên kết một phần với các tệp đầu vào ở các định dạng khác.

Tùy chọn này cũng giống như -i .

-R tên tệp

--just-symbols = tên tệp

Đọc tên biểu tượng và địa chỉ của chúng từ tên tệp , nhưng không định vị lại hoặc đưa nó vào đầu ra. Điều này cho phép tệp đầu ra của bạn tham chiếu biểu tượng đến các vị trí tuyệt đối của bộ nhớ được xác định trong các chương trình khác. Bạn có thể sử dụng tùy chọn này nhiều lần.

Để tương thích với các liên kết ELF khác, nếu tùy chọn -R được theo sau bởi một tên thư mục, chứ không phải là tên tệp, nó được coi là tùy chọn -rpath .

-S

--strip-all

Bỏ qua tất cả thông tin biểu tượng từ tệp đầu ra.

-S

--strip-debug

Bỏ qua thông tin biểu tượng trình gỡ lỗi (nhưng không phải tất cả các ký hiệu) từ tệp đầu ra.

-t

--trace

In tên của các tập tin đầu vào khi ld xử lý chúng.

-Tập lệnh

--script = scriptfile

Sử dụng scriptfile làm kịch bản trình liên kết. Kịch bản lệnh này thay thế kịch bản lệnh liên kết mặc định của ld (thay vì thêm vào nó), do đó, tệp lệnh phải chỉ định mọi thứ cần thiết để mô tả tệp đầu ra. Nếu scriptfile không tồn tại trong thư mục hiện tại, "ld" tìm kiếm nó trong các thư mục được chỉ định bởi bất kỳ tùy chọn -L nào trước đó. Tùy chọn nhiều -T tích lũy.

biểu tượng -u

--undefined = biểu tượng

Biểu tượng lực được nhập vào tệp đầu ra dưới dạng biểu tượng không xác định. Làm điều này có thể, ví dụ, kích hoạt liên kết các mô-đun bổ sung từ các thư viện chuẩn. -u có thể được lặp lại với các đối số tùy chọn khác nhau để nhập các ký hiệu không xác định bổ sung. Tùy chọn này tương đương với lệnh tập lệnh liên kết "EXTERN".

-Ur

Đối với bất kỳ chương trình nào khác ngoài các chương trình C ++, tùy chọn này tương đương với -r : nó tạo ra kết quả đầu ra relocatable --- tức là, một tệp đầu ra có thể chuyển thành đầu vào thành ld . Khi liên kết các chương trình C ++, -Ur không giải quyết các tham chiếu đến các hàm tạo, không giống như -r . Nó không hoạt động để sử dụng -Ur trên các tệp mà chính chúng được liên kết với -Ur ; một khi bảng xây dựng đã được xây dựng, nó không thể được thêm vào. Sử dụng -Ur chỉ cho liên kết một phần cuối cùng và -r cho các liên kết khác.

--unique [= SECTION ]

Tạo một phần đầu ra riêng biệt cho mỗi phần đầu vào khớp với SECTION hoặc nếu đối số SECTION ký tự đại diện tùy chọn bị thiếu, cho mọi phần nhập của trẻ mồ côi. Một phần trẻ mồ côi là một phần không được đề cập cụ thể trong một kịch bản liên kết. Bạn có thể sử dụng tùy chọn này nhiều lần trên dòng lệnh; Nó ngăn cản việc hợp nhất các phần đầu vào bình thường với cùng tên, ghi đè các nhiệm vụ của phần đầu ra trong một kịch bản trình liên kết.

-v

--phiên bản

-V

Hiển thị số phiên bản cho ld . Tùy chọn -V cũng liệt kê các mô phỏng được hỗ trợ.

-x

--Loại bỏ tất cả

Xóa tất cả các ký hiệu cục bộ.

-X

- người địa phương

Xóa tất cả các ký hiệu cục bộ tạm thời. Đối với hầu hết các mục tiêu, đây là tất cả các ký hiệu cục bộ có tên bắt đầu bằng L.

- biểu tượng

--trace-symbol = symbol

In tên của từng tệp được liên kết trong đó biểu tượng xuất hiện. Tùy chọn này có thể được cung cấp bất kỳ số lần nào. Trên nhiều hệ thống, bạn cần phải thêm một dấu gạch dưới.

Tùy chọn này hữu ích khi bạn có biểu tượng không xác định trong liên kết nhưng không biết nguồn tham chiếu đến từ đâu.

-Y đường dẫn

Thêm đường dẫn đến đường dẫn tìm kiếm thư viện mặc định. Tùy chọn này tồn tại cho khả năng tương thích với Solaris.

-z từ khóa

Các từ khóa được công nhận là "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", "origin", "combreloc", "nocombreloc" và "nocopyreloc ". Các từ khóa khác được bỏ qua để tương thích với Solaris. "initfirst" đánh dấu đối tượng được khởi tạo trước khi chạy trước bất kỳ đối tượng nào khác. "interpose" đánh dấu đối tượng mà bảng biểu tượng của nó phân bổ trước tất cả các ký hiệu nhưng thực thi chính. "loadfltr" đánh dấu đối tượng mà bộ lọc của nó được xử lý ngay lập tức khi chạy. "nodefaultlib" đánh dấu đối tượng tìm kiếm phụ thuộc của đối tượng này sẽ bỏ qua bất kỳ đường dẫn tìm kiếm thư viện mặc định nào. "nodelete" đánh dấu đối tượng không được tải xuống khi chạy. "nodlopen" đánh dấu đối tượng không có sẵn cho "dlopen". "nodump" đánh dấu đối tượng không thể được đổ bởi "dldump". "now" đánh dấu đối tượng với ràng buộc thời gian chạy không lười. "origin" đánh dấu đối tượng có thể chứa $ ORIGIN. "defs" không cho phép các ký hiệu không xác định. "muldefs" cho phép nhiều định nghĩa. "combreloc" kết hợp nhiều phần reloc và sắp xếp chúng để làm cho bộ nhớ cache tìm kiếm biểu tượng động có thể.

"nocombreloc" vô hiệu hóa nhiều phần chuyển đổi kết hợp. "nocopyreloc" vô hiệu hóa việc tạo ra các bản sao relocs.

- ( lưu trữ -)

--start-group archives --end-group

Lưu trữ phải là danh sách các tệp lưu trữ . Chúng có thể là tên tệp hoặc các tùy chọn -l .

Các lưu trữ được chỉ định được tìm kiếm liên tục cho đến khi không có tham chiếu mới chưa được xác định nào được tạo. Thông thường, một kho lưu trữ chỉ được tìm kiếm một lần theo thứ tự mà nó được chỉ định trên dòng lệnh. Nếu một biểu tượng trong kho lưu trữ đó là cần thiết để giải quyết một biểu tượng không xác định được đề cập bởi một đối tượng trong một kho lưu trữ xuất hiện sau trên dòng lệnh, trình liên kết sẽ không thể giải quyết tham chiếu đó. Bằng cách nhóm các lưu trữ, tất cả chúng được tìm kiếm liên tục cho đến khi tất cả các tham chiếu có thể được giải quyết.

Sử dụng tùy chọn này có chi phí hiệu suất đáng kể. Tốt nhất là chỉ sử dụng nó khi có các tham chiếu vòng tròn không thể tránh khỏi giữa hai hoặc nhiều lưu trữ.

--accept-unknown-input-arch

--no-accept-unknown-input-arch

Yêu cầu trình liên kết chấp nhận các tệp đầu vào có kiến ​​trúc không thể nhận dạng được. Giả định là người dùng biết những gì họ đang làm và cố ý muốn liên kết trong các tệp đầu vào không xác định này. Đây là hành vi mặc định của trình liên kết, trước khi phát hành 2.14. Hành vi mặc định từ bản phát hành 2.14 trở đi là loại bỏ các tệp đầu vào như vậy và do đó tùy chọn --accept-unknown-input-arch đã được thêm vào để khôi phục hành vi cũ.

-từ khóa -assert

Tùy chọn này được bỏ qua để tương thích với SunOS .

-Bdynamic

- con

-call_shared

Liên kết với thư viện động. Điều này chỉ có ý nghĩa trên các nền tảng mà thư viện được chia sẻ được hỗ trợ. Tùy chọn này thường là mặc định trên các nền tảng như vậy. Các biến thể khác nhau của tùy chọn này là khả năng tương thích với các hệ thống khác nhau. Bạn có thể sử dụng tùy chọn này nhiều lần trên dòng lệnh: nó ảnh hưởng đến thư viện tìm kiếm các tùy chọn -l theo sau nó.

-Nhóm

Đặt cờ "DF_1_GROUP" trong mục nhập "DT_FLAGS_1" trong phần động. Điều này làm cho trình liên kết thời gian chạy để xử lý tra cứu trong đối tượng này và các phụ thuộc của nó chỉ được thực hiện bên trong nhóm. --no-undefined được ngụ ý. Tùy chọn này chỉ có ý nghĩa trên các nền tảng ELF hỗ trợ các thư viện được chia sẻ .

-Bstatic

-dn

-non_shared

-static

Không liên kết với các thư viện được chia sẻ. Điều này chỉ có ý nghĩa trên các nền tảng mà thư viện được chia sẻ được hỗ trợ. Các biến thể khác nhau của tùy chọn này là khả năng tương thích với các hệ thống khác nhau. Bạn có thể sử dụng tùy chọn này nhiều lần trên dòng lệnh: nó ảnh hưởng đến thư viện tìm kiếm các tùy chọn -l theo sau nó.

-Bymymbolic

Khi tạo một thư viện được chia sẻ, hãy liên kết các tham chiếu đến các biểu tượng toàn cầu với định nghĩa trong thư viện được chia sẻ, nếu có. Thông thường, có thể cho một chương trình liên kết với một thư viện được chia sẻ để ghi đè định nghĩa trong thư viện được chia sẻ. Tùy chọn này chỉ có ý nghĩa trên ELFplatforms hỗ trợ thư viện được chia sẻ.

- kiểm tra các phần

--không kiểm tra các phần

Yêu cầu trình liên kết không kiểm tra địa chỉ phần sau khi chúng được chỉ định để xem có bất kỳ trùng lặp nào không. Thông thường, trình liên kết sẽ thực hiện kiểm tra này, và nếu nó tìm thấy bất kỳ sự trùng lặp nào, nó sẽ tạo ra các thông báo lỗi phù hợp. Trình liên kết không biết và thực hiện các khoản phụ cấp cho các phần trong lớp phủ. Hành vi mặc định có thể được khôi phục bằng cách sử dụng công tắc dòng lệnh - kiểm tra các phần .

--cref

Xuất bảng tham chiếu chéo. Nếu một tệp bản đồ liên kết đang được tạo, bảng tham chiếu chéo được in ra tệp bản đồ. Nếu không, nó được in trên đầu ra tiêu chuẩn.

Định dạng của bảng là cố ý đơn giản, do đó nó có thể được xử lý dễ dàng bởi một kịch bản nếu cần thiết. Các biểu tượng được in ra, được sắp xếp theo tên. Đối với mỗi biểu tượng, một danh sách các tên tập tin được đưa ra. Nếu biểu tượng được xác định, tệp đầu tiên được liệt kê là vị trí của định nghĩa. Các tệp còn lại chứa tham chiếu đến biểu tượng.

--no-define-common

Tùy chọn này ức chế việc gán địa chỉ cho các ký hiệu chung. Lệnh tập lệnh "INHIBIT_COMMON_ALLOCATION" có cùng tác dụng.

Tùy chọn --no-define-common cho phép tách quyết định gán địa chỉ cho các ký hiệu chung từ lựa chọn kiểu tệp đầu ra; nếu không, một loại đầu ra không phải Relocatable sẽ gán các địa chỉ cho các ký hiệu chung. Sử dụng --no-define-common cho phép các ký hiệu chung được tham chiếu từ một thư viện được chia sẻ chỉ được gán địa chỉ trong chương trình chính. Điều này loại bỏ không gian trùng lặp không sử dụng trong thư viện được chia sẻ, và cũng ngăn ngừa bất kỳ sự nhầm lẫn nào có thể xảy ra khi phân giải sai khi có nhiều mô-đun động với đường dẫn tìm kiếm chuyên dụng cho độ phân giải biểu tượng thời gian chạy.

- biểu tượng defsym = biểu thức

Tạo một biểu tượng toàn cầu trong tệp đầu ra, chứa địa chỉ tuyệt đối được đưa ra bởi biểu thức . Bạn có thể sử dụng tùy chọn này nhiều lần khi cần thiết để xác định nhiều biểu tượng trong dòng lệnh. Một dạng số học hạn chế được hỗ trợ cho biểu thức trong ngữ cảnh này: bạn có thể cung cấp hằng số thập lục phân hoặc tên của biểu tượng hiện có hoặc sử dụng "+" và "-" để thêm hoặc trừ các hằng số hoặc ký hiệu thập lục phân. Nếu bạn cần các biểu thức phức tạp hơn, hãy xem xét sử dụng ngôn ngữ lệnh trình liên kết từ một tập lệnh. Lưu ý: không nên có khoảng trống giữa biểu tượng , dấu bằng (`` = '') và biểu thức .

--demangle [= kiểu ]

--no-demangle

Các tùy chọn này kiểm soát việc có làm giảm các tên biểu tượng trong các thông báo lỗi và đầu ra khác hay không. Khi trình liên kết được gọi là demangle, nó sẽ cố gắng hiển thị tên biểu tượng theo kiểu có thể đọc được: nó sẽ gạch dưới dấu gạch dưới nếu chúng được định dạng tệp đối tượng sử dụng và chuyển đổi tên biểu tượng x ++ thành tên người dùng có thể đọc được. Trình biên dịch khác nhau có phong cách mangling khác nhau. Đối số kiểu tùy chọn demangling tùy chọn có thể được sử dụng để chọn kiểu demangling thích hợp cho trình biên dịch của bạn. Trình liên kết sẽ bị gỡ rối theo mặc định trừ khi biến môi trường COLLECT_NO_DEMANGLE được đặt. Các tùy chọn này có thể được sử dụng để ghi đè lên mặc định.

- tệp liên kết động lực học

Đặt tên của liên kết động. Điều này chỉ có ý nghĩa khi tạo các tệp thi hành ELF được liên kết động. Trình liên kết động mặc định thường là chính xác; không sử dụng điều này trừ khi bạn biết những gì bạn đang làm.

--embedded-relocs

Tùy chọn này chỉ có ý nghĩa khi liên kết mã PIC nhúng MIPS, được tạo ra bởi tùy chọn -membedded-pic vào trình biên dịch GNU và trình biên dịch. Nó làm cho trình liên kết tạo ra một bảng có thể được sử dụng trong thời gian chạy để di chuyển bất kỳ dữ liệu nào được khởi tạo tĩnh đến các giá trị con trỏ. Xem mã trong testsuite / ld-empic để biết chi tiết.

- cảnh báo giới tính

Xử lý tất cả các cảnh báo dưới dạng lỗi .

--force-exe-hậu tố

Đảm bảo rằng tệp đầu ra có hậu tố .exe.

Nếu tệp đầu ra được tạo thành công được liên kết đầy đủ không có hậu tố ". Exe " hoặc " .dll ", tùy chọn này sẽ buộc trình liên kết sao chép tệp đầu ra vào một tên trùng với hậu tố ".exe". Tùy chọn này hữu ích khi sử dụng các tệp makefiles Unix chưa sửa đổi trên máy chủ Microsoft Windows, vì một số phiên bản Windows sẽ không chạy hình ảnh trừ khi nó kết thúc bằng hậu tố ".exe".

--no-gc-sections

--các phần

Bật thu thập rác của các mục nhập không sử dụng. Nó được bỏ qua trên các mục tiêu không hỗ trợ tùy chọn này. Tùy chọn này không tương thích với -r , cũng không nên sử dụng tùy chọn này với liên kết động. Hành vi mặc định (không thực hiện bộ sưu tập rác này) có thể được khôi phục bằng cách chỉ định --no-gc-sections trên dòng lệnh.

--Cứu giúp

In tóm tắt các tùy chọn dòng lệnh trên đầu ra tiêu chuẩn và thoát.

--target-help

In tóm tắt tất cả các tùy chọn mục tiêu cụ thể về đầu ra tiêu chuẩn và thoát.

-Map mapfile

In một bản đồ liên kết đến tệp mapfile . Xem mô tả về tùy chọn -M , ở trên.

--no-keep-memory

ld thường tối ưu hóa cho tốc độ sử dụng bộ nhớ bằng cách lưu vào bộ nhớ đệm các bảng biểu tượng của các tệp đầu vào trong bộ nhớ. Tùy chọn này cho phép ld thay vào đó tối ưu hóa việc sử dụng bộ nhớ, bằng cách đọc lại các bảng biểu tượng nếu cần. Điều này có thể được yêu cầu nếu ld hết dung lượng bộ nhớ trong khi liên kết một tệp thực thi lớn.

--no-undefined

-z defs

Thông thường khi tạo một thư viện chia sẻ không ký hiệu, các ký hiệu không xác định được cho phép và được giải quyết bởi trình tải thời gian chạy. Các tùy chọn này không cho phép các biểu tượng không xác định như vậy.

--cho phép nhiều định nghĩa

-z muldefs

Thông thường khi một biểu tượng được xác định nhiều lần, trình liên kết sẽ báo cáo một lỗi nghiêm trọng. Các tùy chọn này cho phép nhiều định nghĩa và định nghĩa đầu tiên sẽ được sử dụng.

--allow-shlib-undefined

Cho phép các ký hiệu không xác định trong các đối tượng được chia sẻ ngay cả khi --no-undefined được đặt. Kết quả ròng sẽ là các ký hiệu không xác định trong các đối tượng thông thường sẽ vẫn kích hoạt một lỗi, nhưng các ký hiệu không xác định trong các đối tượng dùng chung sẽ bị bỏ qua. Việc thực hiện no_undefined làm cho giả định rằng trình liên kết thời gian chạy sẽ bị nghẹt thở trên các ký hiệu không xác định. Tuy nhiên có ít nhất một hệ thống (BeOS), nơi các ký hiệu không xác định trong các thư viện được chia sẻ là bình thường vì hạt nhân vá chúng vào thời gian tải để chọn hàm nào thích hợp nhất cho kiến ​​trúc hiện tại. IE tự động chọn một chức năng ghi nhớ thích hợp. Rõ ràng nó cũng bình thường đối với các thư viện chia sẻ HPPA để có các ký hiệu không xác định.

--no-undefined-version

Thông thường khi một biểu tượng có một phiên bản không xác định, trình liên kết sẽ bỏ qua nó. Tùy chọn này không cho phép các biểu tượng có phiên bản không xác định và một lỗi nghiêm trọng sẽ được phát hành thay thế.

--không cảnh báo-không khớp

Thông thường ld sẽ đưa ra một lỗi nếu bạn cố gắng liên kết các tệp đầu vào không khớp với một số lý do, có lẽ vì chúng đã được biên dịch cho các bộ xử lý khác nhau hoặc cho các endianness khác nhau. Tùy chọn này cho ld rằng nó sẽ âm thầm cho phép các lỗi có thể xảy ra. Tùy chọn này chỉ nên được sử dụng cẩn thận, trong trường hợp bạn đã thực hiện một số hành động đặc biệt để đảm bảo rằng các lỗi của trình liên kết không phù hợp.

--no-toàn bộ-lưu trữ

Tắt hiệu ứng của tùy chọn --whole-archive cho các tệp lưu trữ tiếp theo.

--noinhibit-exec

Giữ lại tệp đầu ra thực thi bất cứ khi nào nó vẫn có thể sử dụng được. Thông thường, trình liên kết sẽ không tạo ra tệp đầu ra nếu nó gặp lỗi trong quá trình liên kết; nó thoát ra mà không cần viết một tập tin đầu ra khi nó phát ra bất kỳ lỗi nào.

-nostdlib

Chỉ các thư mục thư viện tìm kiếm được chỉ định rõ ràng trên dòng lệnh. Thư mục thư viện được chỉ định trong các kịch bản liên kết (bao gồm cả các kịch bản liên kết được chỉ định trên dòng lệnh) được bỏ qua.

- định dạng đầu ra định dạng

ld có thể được cấu hình để hỗ trợ nhiều hơn một loại tập tin đối tượng. Nếu ld của bạn được cấu hình theo cách này, bạn có thể sử dụng tùy chọn --oformat để chỉ định định dạng nhị phân cho tệp đối tượng đầu ra. Ngay cả khi ld được cấu hình để hỗ trợ các định dạng đối tượng thay thế, bạn thường không cần phải xác định điều này, vì ld nên được cấu hình để tạo ra dưới dạng định dạng đầu ra mặc định định dạng thông thường nhất trên mỗi máy. định dạng đầu ra là một chuỗi văn bản, tên của một định dạng cụ thể được hỗ trợ bởi các thư viện BFD. (Bạn có thể liệt kê các định dạng nhị phân có sẵn với objdump -i .) Lệnh script "OUTPUT_FORMAT" cũng có thể chỉ định định dạng đầu ra, nhưng tùy chọn này sẽ ghi đè nó.

-qmagic

Tùy chọn này bị bỏ qua cho khả năng tương thích với Linux.

-Qy

Tùy chọn này bị bỏ qua cho khả năng tương thích SVR4.

--thư giãn

Một tùy chọn với các hiệu ứng phụ thuộc máy. Tùy chọn này chỉ được hỗ trợ trên một vài mục tiêu.

Trên một số nền tảng, tùy chọn --relax thực hiện tối ưu hóa toàn cầu có thể trở thành có thể khi trình liên kết giải quyết địa chỉ trong chương trình, chẳng hạn như chế độ địa chỉ thư giãn và tổng hợp các hướng dẫn mới trong tệp đối tượng đầu ra.

Trên một số nền tảng, thời gian liên kết tối ưu hóa toàn cầu này có thể làm cho việc gỡ lỗi biểu tượng của kết quả không thể thực thi được. Điều này được biết là trường hợp của bộ vi xử lý Matsushita MN10200and MN10300.

Trên các nền tảng mà điều này không được hỗ trợ, --relax được chấp nhận, nhưng bị bỏ qua.

--tên tập tin-biểu tượng-biểu tượng

Chỉ giữ lại các biểu tượng được liệt kê trong tên tệp , loại bỏ tất cả các ký hiệu khác. tên tệp chỉ đơn giản là một tệp phẳng, với một tên biểu tượng trên mỗi dòng. Tùy chọn này đặc biệt hữu ích trong các môi trường (chẳng hạn như VxWorks), nơi một bảng biểu tượng toàn cầu lớn được tích lũy dần dần, để bảo tồn bộ nhớ thời gian chạy.

--retain-symbols-file không loại bỏ các ký hiệu không xác định hoặc các biểu tượng cần thiết cho việc di chuyển.

Bạn chỉ có thể chỉ định --retain-symbols-file một lần trong dòng lệnh. Nó ghi đè -s-S .

-rãnh đạo

Thêm một thư mục vào đường dẫn tìm kiếm thư viện thời gian chạy. Điều này được sử dụng khi liên kết một ELFexecutable với các đối tượng được chia sẻ. Tất cả các đối số -rpath được nối và được chuyển tới trình liên kết thời gian chạy, sử dụng chúng để định vị các đối tượng được chia sẻ trong thời gian chạy. Tùy chọn -rpath cũng được sử dụng khi định vị các đối tượng được chia sẻ cần thiết bởi các đối tượng được chia sẻ một cách rõ ràng được bao gồm trong liên kết; xem mô tả về tùy chọn -rpath-link . Nếu -rpath không được sử dụng khi liên kết một tệp thực thi ELF, nội dung của biến môi trường "LD_RUN_PATH" sẽ được sử dụng nếu nó được định nghĩa.

Tùy chọn -rpath cũng có thể được sử dụng trên SunOS. Theo mặc định, trên SunOS, trình liên kết sẽ tạo thành một bản vá tìm kiếm thời gian chạy trong số tất cả các tùy chọn -L được cung cấp. Nếu một tùy chọn -rpath được sử dụng, đường dẫn tìm kiếm thời gian chạy sẽ được hình thành độc quyền bằng cách sử dụng các tùy chọn -rpath , bỏ qua các tùy chọn -L . Điều này có thể hữu ích khi sử dụng gcc, điều này bổ sung thêm nhiều tùy chọn -L có thể có trên các hệ thống tập tin được gắnNFS.

Để tương thích với các liên kết ELF khác, nếu tùy chọn -R được theo sau bởi một tên thư mục, chứ không phải là tên tệp, nó được coi là tùy chọn -rpath .

-rpath-link DIR

Khi sử dụng ELF hoặc SunOS, một thư viện được chia sẻ có thể yêu cầu một thư viện khác. Điều này xảy ra khi liên kết "ld-shared" bao gồm thư viện được chia sẻ làm một trong các tệp đầu vào.

Khi trình liên kết gặp phải sự phụ thuộc như vậy khi thực hiện liên kết không chia sẻ, không thể định vị lại, nó sẽ tự động tìm cách định vị thư viện được chia sẻ cần thiết và đưa nó vào liên kết, nếu nó không được bao gồm một cách rõ ràng. Trong trường hợp này, tùy chọn -rpath-link chỉ định tập hợp các thư mục đầu tiên để tìm kiếm. Tùy chọn -rpath-link có thể chỉ định một chuỗi các tên thư mục bằng cách chỉ định một danh sách các tên được phân tách bằng dấu hai chấm hoặc bằng cách xuất hiện nhiều lần.

Tùy chọn này nên được sử dụng thận trọng vì nó ghi đè đường dẫn tìm kiếm có thể đã được biên dịch thành một thư viện được chia sẻ. Trong trường hợp này, có thể sử dụng vô tình một đường dẫn tìm kiếm khác với trình liên kết thời gian chạy sẽ thực hiện.

Trình liên kết sử dụng các đường dẫn tìm kiếm sau để định vị các thư viện được chia sẻ cần thiết.

1.

Bất kỳ thư mục nào được chỉ định bởi tùy chọn -rpath-link .

2.

Bất kỳ thư mục nào được chỉ định bởi tùy chọn -rpath . Sự khác biệt giữa -rpath-rpath-link là các thư mục được chỉ định bởi các tùy chọn -rpath được bao gồm trong tệp thi hành và được sử dụng trong thời gian chạy, trong khi tùy chọn -rpath-link chỉ có hiệu lực tại thời gian liên kết. Nó chỉ dành cho trình liên kết gốc.

3.

Trên hệ thống ELF, nếu các tùy chọn -rpath và "rpath-link" không được sử dụng, hãy tìm kiếm nội dung của biến môi trường "LD_RUN_PATH". Nó chỉ dành cho trình liên kết gốc.

4.

Trên SunOS, nếu tùy chọn -rpath không được sử dụng, tìm kiếm bất kỳ thư mục nào được chỉ định bằng tùy chọn -L .

5.

Đối với liên kết gốc, nội dung của biến môi trường "LD_LIBRARY_PATH".

6.

Đối với một liên kết ELF bản địa, các thư mục trong "DT_RUNPATH" hoặc "DT_RPATH" của một thư viện được chia sẻ được tìm kiếm cho các thư viện được chia sẻ cần thiết bởi nó. Các mục "DT_RPATH" bị bỏ qua nếu mục "DT_RUNPATH" tồn tại.

7.

Các thư mục mặc định, thông thường / lib/ usr / lib .

số 8.

Đối với một trình liên kết gốc trên hệ thống ELF, nếu tệp /etc/ld.so.conf tồn tại, danh sách các thư mục được tìm thấy trong tệp đó.

Nếu không tìm thấy thư viện được chia sẻ cần thiết, trình liên kết sẽ đưa ra cảnh báo và tiếp tục với liên kết.

đã chia sẻ

-Barareable

Tạo một thư viện được chia sẻ. Điều này hiện chỉ được hỗ trợ trên nền tảng ELF, XCOFF và SunOS. Trên SunOS, trình liên kết sẽ tự động tạo một thư viện được chia sẻ nếu tùy chọn -e không được sử dụng và có các biểu tượng không xác định trong liên kết.

- phổ biến

Tùy chọn này cho ld sắp xếp các ký hiệu phổ biến theo kích thước khi nó đặt chúng trong các phần đầu ra thích hợp. Đầu tiên là tất cả các ký tự một byte, sau đó tất cả hai byte, sau đó tất cả bốn byte, và sau đó tất cả mọi thứ khác. Điều này là để ngăn chặn khoảng cách giữa các biểu tượng do ràng buộc liên kết.

--split-by-file [ size ]

Tương tự như --split-by-reloc nhưng tạo ra một phần đầu ra mới cho mỗi tệp đầu vào khi đạt đến kích thước . kích thước mặc định là 1 nếu không được.

--split-by-reloc [ count ]

Cố gắng tạo thêm các phần trong tệp đầu ra để không có phần đầu ra duy nhất nào trong tệp chứa nhiều chuyển đổi số . Điều này rất hữu ích khi tạo các tệp có khả năng di chuyển lớn để tải xuống các hạt nhân thời gian thực nhất định với định dạng tệp đối tượng COFF; vì COFFcannot đại diện cho hơn 65535 chuyển vị trí trong một phần. Lưu ý rằng điều này sẽ không hoạt động với các định dạng tệp đối tượng không hỗ trợ các phần tùy ý. Trình liên kết sẽ không chia nhỏ các phần đầu vào riêng lẻ để phân phối lại, do đó, nếu một phần đầu vào đơn lẻ chứa nhiều chuyển đổi số, một phần đầu ra sẽ chứa nhiều chuyển đổi đó. đếm mặc định là giá trị 32768.

--stats

Tính toán và hiển thị số liệu thống kê về hoạt động của trình liên kết, chẳng hạn như thời gian thực hiện và sử dụng bộ nhớ.

- định dạng truyền thống

Đối với một số mục tiêu, đầu ra của ld là khác nhau theo một số cách từ đầu ra của một số trình liên kết hiện có. Chuyển đổi này yêu cầu ld sử dụng định dạng truyền thống thay thế.

Ví dụ, trên SunOS, ld kết hợp các mục trùng lặp trong bảng chuỗi ký hiệu. Điều này có thể làm giảm kích thước của một tập tin đầu ra với thông tin gỡ lỗi đầy đủ hơn 30 phần trăm. Thật không may, chương trình "dbx" của SunOS không thể đọc chương trình kết quả ("gdb" không gặp sự cố). Chuyển đổi định dạng -truyền thống yêu cầu ld không kết hợp các mục trùng lặp.

--section-start sectionname = org

Tìm một phần trong tệp đầu ra tại địa chỉ tuyệt đối do org cung cấp. Bạn có thể sử dụng tùy chọn này nhiều lần khi cần thiết để định vị nhiều phần trong dòng lệnh. org phải là một số nguyên hệ thập lục phân; để tương thích với các trình liên kết khác, bạn có thể bỏ qua 0x hàng đầu thường được liên kết với các giá trị thập lục phân. Lưu ý: không nên có khoảng trắng giữa tên phần , dấu bằng (`` = '') và org .

-Tbss org

-Tổ chức dữ liệu

-Textext

Sử dụng tổ chức làm địa chỉ bắt đầu cho --- tương ứng --- phân đoạn "bss", "dữ liệu" hoặc phân đoạn "văn bản" của tệp đầu ra. org phải là một số nguyên hệ thập lục phân; để tương thích với các trình liên kết khác, bạn có thể bỏ qua 0x hàng đầu thường được liên kết với các giá trị thập lục phân.

- dll-verbose

--verbose

Hiển thị số phiên bản cho ld và liệt kê các mô phỏng trình liên kết được hỗ trợ. Hiển thị các tệp đầu vào nào có thể và không thể mở được. Hiển thị tập lệnh liên kết đang được trình liên kết sử dụng.

--version-script = version-scriptfile

Chỉ định tên của tập lệnh phiên bản cho trình liên kết. Điều này thường được sử dụng khi tạo thư viện được chia sẻ để chỉ định thêm thông tin về chế độ heirarchy phiên bản cho thư viện được tạo. Tùy chọn này chỉ có ý nghĩa trên các nền tảng ELF hỗ trợ các thư viện được chia sẻ.

- thông thường

Cảnh báo khi một biểu tượng chung được kết hợp với một biểu tượng chung khác hoặc với định nghĩa ký hiệu. Các trình liên kết Unix cho phép thực hành hơi cẩu thả này, nhưng các liên kết trên một số hệ điều hành khác thì không. Tùy chọn này cho phép bạn tìm các vấn đề tiềm ẩn từ việc kết hợp các biểu tượng chung. Thật không may, một số thư viện C sử dụng thực hành này, vì vậy bạn có thể nhận được một số cảnh báo về các biểu tượng trong thư viện cũng như trong các chương trình của bạn.

Có ba loại biểu tượng toàn cục, được minh họa ở đây bằng các ví dụ C:

int i = 1;

Định nghĩa, nằm trong phần dữ liệu được khởi tạo của tệp đầu ra.

extern int i;

Tham chiếu không xác định, không phân bổ không gian. Phải có một định nghĩa hoặc một biểu tượng chung cho biến ở đâu đó.

int i;

Một biểu tượng chung. Nếu chỉ có một (hoặc nhiều) ký hiệu chung cho một biến, nó sẽ xuất hiện trong vùng dữ liệu chưa được khởi tạo của tệp đầu ra. Trình liên kết kết hợp nhiều biểu tượng phổ biến cho cùng một biến thành một biểu tượng duy nhất. Nếu chúng có kích thước khác nhau, nó sẽ có kích thước lớn nhất. Trình liên kết biến một biểu tượng chung thành một khai báo, nếu có định nghĩa của cùng một biến.

Tùy chọn -warn-common có thể tạo ra năm loại cảnh báo. Mỗi cảnh báo bao gồm một cặp các dòng: đầu tiên mô tả các biểu tượng chỉ gặp phải, và thứ hai mô tả các biểu tượng trước đó gặp phải với cùng một tên. Một hoặc cả hai biểu tượng sẽ là một biểu tượng chung.

1.

Biến một biểu tượng chung thành một tham chiếu, bởi vì đã có một định nghĩa cho biểu tượng.

(
): warning: common của ` 'bị ghi đè bởi định nghĩa (
): warning: được định nghĩa ở đây

2.

Biến một biểu tượng chung thành một tham chiếu, vì một định nghĩa sau này cho biểu tượng được gặp phải. Điều này giống với trường hợp trước, ngoại trừ các biểu tượng được gặp theo một thứ tự khác.

(
): warning: định nghĩa ` 'ghi đè phổ biến (
): warning: common là ở đây

3.

Hợp nhất một biểu tượng chung với một biểu tượng chung có kích thước tương tự trước đó.

(
): cảnh báo: nhiều điểm chung của ` ' (
): warning: trước đây là ở đây

4.

Hợp nhất một biểu tượng chung với một biểu tượng chung lớn hơn trước đó.

(
): cảnh báo: phổ biến của ` 'bị ghi đè bởi (
) phổ biến hơn: cảnh báo: phổ biến hơn là ở đây

5.

Hợp nhất một biểu tượng chung với một biểu tượng chung nhỏ hơn trước đó. Điều này giống với trường hợp trước, ngoại trừ các biểu tượng được gặp theo một thứ tự khác.

(
): cảnh báo: phổ biến của ` 'ghi đè (
) phổ biến nhỏ hơn: cảnh báo: nhỏ hơn phổ biến là ở đây

- nhà thầu xây dựng

Cảnh báo nếu bất kỳ nhà xây dựng toàn cầu nào được sử dụng. Điều này chỉ hữu ích cho một vài định dạng tệp đối tượng. Đối với các định dạng như COFF hoặc ELF, trình liên kết không thể phát hiện việc sử dụng các hàm tạo chung.

--warn-multiple-gp

Cảnh báo nếu cần nhiều giá trị con trỏ chung trong tệp đầu ra . Điều này chỉ có ý nghĩa đối với một số bộ vi xử lý, chẳng hạn như Alpha. Cụ thể, một số nhà chế biến đặt các hằng số có giá trị lớn vào một phần đặc biệt. Một thanh ghi đặc biệt (con trỏ toàn cục) trỏ vào giữa phần này, để các hằng số có thể được nạp một cách hiệu quả thông qua chế độ địa chỉ liên quan đến cơ sở đăng ký. Vì bù đắp trong chế độ tương đối cơ sở đăng ký là cố định và tương đối nhỏ (ví dụ, 16 bit), điều này giới hạn kích thước tối đa của hồ bơi không đổi. Vì vậy, trong các chương trình lớn, nó thường là cần thiết để sử dụng nhiều giá trị con trỏ toàn cầu để có thể giải quyết tất cả các hằng số có thể. Tùy chọn này gây ra cảnh báo được phát hành bất cứ khi nào trường hợp này xảy ra.

- một lần

Chỉ cảnh báo một lần cho mỗi biểu tượng không xác định, thay vì một lần cho mỗi mô-đun đề cập đến nó.

--làm phẳng

Cảnh báo nếu địa chỉ của phần đầu ra bị thay đổi do căn chỉnh. Thông thường, căn chỉnh sẽ được thiết lập bởi một phần đầu vào. Địa chỉ sẽ chỉ được thay đổi nếu nó không được chỉ định rõ ràng; đó là, nếu lệnh "SECTIONS" không chỉ định địa chỉ bắt đầu cho phần đó.

--whole-archive

Đối với mỗi kho lưu trữ được đề cập trên dòng lệnh sau tùy chọn --whole-archive , bao gồm mọi tệp đối tượng trong tệp lưu trữ trong liên kết, thay vì tìm kiếm tệp lưu trữ cho các tệp đối tượng được yêu cầu. Điều này thường được sử dụng để biến một tệp lưu trữ thành một thư viện được chia sẻ, buộc mọi đối tượng phải được bao gồm trong thư viện được chia sẻ kết quả. Tùy chọn này có thể được sử dụng nhiều lần.

Hai lưu ý khi sử dụng tùy chọn này từ gcc: Đầu tiên, gcc không biết về tùy chọn này, vì vậy bạn phải sử dụng -Wl, -whole-archive . Thứ hai, đừng quên sử dụng -Wl, -no-whole-archive sau danh sách lưu trữ của bạn, bởi vì gcc sẽ thêm danh sách lưu trữ của riêng nó vào liên kết của bạn và bạn có thể không muốn cờ này ảnh hưởng đến chúng.

- biểu tượng

Sử dụng hàm bao bọc cho biểu tượng . Bất kỳ tham chiếu không xác định nào đến biểu tượng sẽ được giải quyết thành "__ wrap_symbol". Bất kỳ tham chiếu không xác định nào đến "__real_symbol" sẽ được giải quyết thành ký hiệu .

Điều này có thể được sử dụng để cung cấp một trình bao bọc cho một hàm hệ thống. Hàm wrapper nên được gọi là "__wrap_symbol". Nếu nó muốn gọi hàm hệ thống, nó sẽ gọi "__ real_symbol".

Đây là một ví dụ tầm thường:

void * __wrap_malloc (int c) {printf ("malloc được gọi với% ld \ n", c); return __real_malloc (c); }

Nếu bạn liên kết mã khác với tệp này bằng cách sử dụng --wrap malloc , thì tất cả lệnh gọi tới "malloc" sẽ gọi hàm "__wrap_malloc" thay thế. Cuộc gọi đến "__real_malloc" trong "__wrap_malloc" sẽ gọi hàm "malloc" thực sự.

Bạn cũng có thể cung cấp một hàm "__real_malloc" để các liên kết không có tùy chọn --wrap sẽ thành công. Nếu bạn làm điều này, bạn không nên đặt định nghĩa của "__ real_malloc" trong cùng một tệp với "__wrap_malloc"; nếu bạn làm thế, người lắp ráp có thể giải quyết cuộc gọi trước khi trình liên kết có cơ hội để bọc nó vào "malloc".

--enable-new-dtags

--disable-new-dtags

Mối liên kết này có thể tạo các thẻ động mới trong ELF. Nhưng các hệ thống ELF cũ hơn có thể không hiểu chúng. Nếu bạn chỉ định --enable-new-dtags , các thẻ động sẽ được tạo khi cần. Nếu bạn chỉ định --disable-new-dtags , sẽ không có thẻ động mới nào được tạo. Theo mặc định, các thẻ động mới không được tạo. Lưu ý rằng các tùy chọn này chỉ có sẵn cho các hệ thống forFF.

Trình liên kết i386 PE hỗ trợ tùy chọn chia sẻ , làm cho đầu ra là một thư viện được liên kết động (DLL) thay vì một tệp thực thi bình thường. Bạn nên đặt tên cho đầu ra "* .dll" khi bạn sử dụng tùy chọn này. Ngoài ra, trình liên kết hỗ trợ đầy đủ các tệp "* .def" chuẩn, có thể được chỉ định trên dòng lệnh của trình liên kết như một tệp đối tượng (trên thực tế, nó phải đứng trước các lưu trữ nó xuất các ký hiệu, để đảm bảo chúng được liên kết, giống như một tệp đối tượng bình thường).

Ngoài các tùy chọn chung cho tất cả các mục tiêu, liên kết i386 PE hỗ trợ các tùy chọn dòng lệnh bổ sung dành riêng cho đích i386 PE. Các tùy chọn lấy giá trị có thể được tách biệt với giá trị của chúng bằng dấu cách hoặc dấu bằng.

--add-stdcall-alias

Nếu được, các ký hiệu có hậu tố stdcall (@ nn ) sẽ được xuất dưới dạng và cũng với hậu tố bị tước.

- tệp tệp cơ sở

Sử dụng tập tin như tên của một tập tin trong đó để lưu các địa chỉ cơ sở của tất cả các relocations cần thiết để tạo DLL với dlltool .

--dll

Tạo một DLL thay vì thực thi thường xuyên. Bạn cũng có thể sử dụng chia sẻ hoặc chỉ định một "THƯ VIỆN" trong một tệp ".def" đã cho.

--enable-stdcall-fixup

--disable-stdcall-fixup

Nếu liên kết tìm thấy một biểu tượng mà nó không thể giải quyết, nó sẽ cố gắng thực hiện `` liên kết mờ '' bằng cách tìm một ký hiệu được định nghĩa khác chỉ ở định dạng của tên ký hiệu (cdecl vs stdcall) và sẽ giải quyết biểu tượng đó bằng cách liên kết cho trận đấu. Ví dụ: biểu tượng không xác định "_foo" có thể được liên kết với hàm "_foo @ 12" hoặc biểu tượng không xác định "_bar @ 16" có thể được liên kết với hàm "_bar". Khi trình liên kết thực hiện điều này, nó sẽ in một cảnh báo, vì thông thường nó sẽ không liên kết được, nhưng đôi khi việc nhập các thư viện được tạo từ các dll của bên thứ ba có thể cần tính năng này để có thể sử dụng được. Nếu bạn chỉ định --enable-stdcall-fixup , tính năng này được kích hoạt hoàn toàn và các cảnh báo sẽ không được in. Nếu bạn chỉ định --disable-stdcall-fixup , tính năng này bị vô hiệu hóa và những sự không phù hợp đó được coi là lỗi.

--export-all-symbols

Nếu được, tất cả các biểu tượng toàn cầu trong các đối tượng được sử dụng để xây dựng một DLL sẽ được xuất khẩu bởi các DLL. Lưu ý rằng đây là mặc định nếu có nếu không sẽ không có bất kỳ biểu tượng xuất khẩu. Khi các biểu tượng được xuất khẩu rõ ràng thông qua các tệp DEF hoặc được xuất khẩu ngầm qua các thuộc tính hàm, mặc định là không xuất bất kỳ thứ gì khác trừ khi tùy chọn này được đưa ra. Lưu ý rằng các ký hiệu "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12" và "impure_ptr" sẽ không được tự động xuất. Ngoài ra, các biểu tượng được nhập từ các tệp DLL khác sẽ không được tái xuất, cũng như các ký hiệu sẽ chỉ định bố cục bên trong của DLL chẳng hạn như các biểu tượng bắt đầu bằng "_head_" hoặc kết thúc bằng "_iname". Ngoài ra, không có biểu tượng nào từ "libgcc", "libstd ++", "libmingw32" hoặc "crtX.o" sẽ được xuất. Các biểu tượng có tên bắt đầu bằng "__rtti_" hoặc "__builtin_" sẽ không được xuất, để trợ giúp với C ++ DLL. Cuối cùng, có một danh sách rộng lớn các ký hiệu cygwin-private không được xuất khẩu (rõ ràng, điều này áp dụng khi xây dựng các tệp DLL cho các mục tiêu Cygwin).

Những Cygwin-loại trừ này là: "_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 ", và" môi trường ".

- biểu tượng , biểu tượng , ...

Chỉ định danh sách các ký hiệu không được xuất tự động. Tên biểu tượng có thể được phân tách bằng dấu phẩy hoặc dấu hai chấm.

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

Chỉ định danh sách các thư viện lưu trữ mà từ đó các biểu tượng không được tự động xuất. Tên thư viện có thể được phân tách bằng dấu phẩy hoặc dấu hai chấm. Chỉ định "--exclude-libs ALL" loại trừ các biểu tượng trong tất cả thư viện lưu trữ khỏi xuất tự động. Các biểu tượng được liệt kê rõ ràng trong tệp .def vẫn được xuất, bất kể tùy chọn này.

--file-alignment

Chỉ định căn chỉnh tệp. Các phần trong tệp sẽ luôn bắt đầu ở phần bù tập tin là bội số của số này. Giá trị mặc định là 512.

-dự trữ dự trữ

-dự trữ dự trữ , cam kết

Xác định số lượng bộ nhớ để dự trữ (và tùy chọn cam kết) được sử dụng như là đống cho chương trình này. Giá trị mặc định là 1Mb, 4K cam kết.

--giá trị cơ sở

Sử dụng giá trị làm địa chỉ cơ sở của chương trình hoặc dll của bạn. Đây là vị trí bộ nhớ thấp nhất sẽ được sử dụng khi chương trình hoặc dll của bạn được tải. Để giảm nhu cầu di dời và cải thiện hiệu suất của các dll của bạn, mỗi tệp phải có một địa chỉ cơ sở duy nhất và không chồng lên bất kỳ dll nào khác. Giá trị mặc định là 0x400000 cho tệp thi hành và 0x10000000 cho dll.

--kill-at

Nếu được, hậu tố stdcall (@ nn ) sẽ bị tước khỏi các biểu tượng trước khi chúng được xuất khẩu.

- Giá trị phiên bản hình ảnh lớn

Đặt số lượng lớn của `` phiên bản hình ảnh ''. Mặc định là 1.

- Giá trị phiên bản lớn-os

Đặt số lượng lớn của `phiên bản os ''. Mặc định là 4.

- Giá trị phiên bản hệ thống con lớn

Đặt số lượng lớn của `` phiên bản hệ thống con ''. Mặc định là 4.

--giá trị phiên bản hình ảnh tối thiểu

Đặt số nhỏ của `` phiên bản hình ảnh ''. Mặc định là 0.

--giá trị phiên bản -giá-os

Đặt số nhỏ của `` os version ''. Mặc định là 0.

--giá trị phiên bản hệ thống con -minor

Đặt số nhỏ của `` phiên bản hệ thống con ''. Mặc định là 0.

--tập tin def-def

Trình liên kết sẽ tạo tệp tệp sẽ chứa tệp DEF tương ứng với DLL mà trình liên kết đang tạo. Tệp DEF này (được gọi là "* .def") có thể được sử dụng để tạo thư viện nhập bằng "dlltool" hoặc có thể được sử dụng làm tham chiếu đến các biểu tượng tự động hoặc xuất ngầm.

--out-implib file

Trình liên kết sẽ tạo tệp tệp sẽ chứa một lib nhập tương ứng với DLL mà trình liên kết đang tạo. Thư viện nhập khẩu này (được gọi là "* .dll.a" hoặc "* .a" có thể được sử dụng để liên kết các máy khách với DLL được sinh ra; hành vi này làm cho nó có thể bỏ qua bước tạo thư viện nhập "dlltool" riêng biệt.

--enable-auto-image-base

Tự động chọn cơ sở hình ảnh cho các tệp DLL, trừ khi một được xác định bằng cách sử dụng đối số "--image-base". Bằng cách sử dụng một băm được tạo ra từ dllname để tạo cơ sở hình ảnh duy nhất cho mỗi DLL, trong bộ nhớ va chạm và relocations mà có thể trì hoãn thực hiện chương trình được tránh.

--disable-auto-image-base

Không tự động tạo cơ sở hình ảnh duy nhất. Nếu không có cơ sở hình ảnh do người dùng chỉ định ("--image-base") thì hãy sử dụng nền tảng mặc định.

--dll- chuỗi tiền tố tìm kiếm

Khi liên kết động với một dll mà không cần thư viện nhập, hãy tìm kiếm " .dll" trong tùy chọn "lib .dll". Hành vi này cho phép phân biệt dễ dàng giữa các tệp DLL được xây dựng cho các `nền tảng con khác nhau ': native, cygwin, uwin, pw, v.v. Ví dụ, các tệp DLL Cygwin thường sử dụng" --dll-search-prefix = cyg ".

- có thể tự động nhập

Làm phức tạp liên kết của "_symbol" để "__imp__symbol" cho DATA nhập khẩu từ DLLs, và tạo ra các biểu tượng thunking cần thiết khi xây dựng các thư viện nhập khẩu với những DATAexports. Điều này thường sẽ 'chỉ hoạt động' --- nhưng đôi khi bạn có thể thấy thông báo này:

Không thể tự động nhập "biến ''. Vui lòng đọc tài liệu về" có thể tự động nhập "của ld để biết chi tiết".

Thông báo này xảy ra khi một số biểu thức (phụ) truy cập vào một địa chỉ cuối cùng được đưa ra bởi tổng của hai hằng số (Win32 nhập khẩu bảng chỉ cho phép một). Các trường hợp mà điều này có thể xảy ra bao gồm quyền truy cập vào các trường thành viên của các biến struct được nhập từ một DLL, cũng như sử dụng một chỉ mục hằng số vào một biến mảng được nhập từ một DLL. Bất kỳ biến nhiều từ (mảng, cấu trúc, dài, vv) có thể kích hoạt điều kiện lỗi này. Tuy nhiên, bất kể loại dữ liệu chính xác của biến xuất khẩu vi phạm, ld sẽ luôn phát hiện ra nó, phát hành cảnh báo và thoát.

Có một số cách để giải quyết khó khăn này, bất kể loại dữ liệu của biến được xuất:

Một cách là sử dụng chuyển đổi --enable-runtime-pseudo-reloc. Điều này lá nhiệm vụ điều chỉnh tài liệu tham khảo trong mã khách hàng của bạn cho môi trường thời gian chạy, do đó, phương pháp này chỉ hoạt động khi environtment thời gian chạy hỗ trợ tính năng này.

Giải pháp thứ hai là buộc một trong các 'hằng số' trở thành một biến --- đó là, không rõ và không thể tối ưu hóa tại thời gian biên dịch. Đối với mảng, có hai khả năng: a) làm cho chỉ mục (địa chỉ của mảng) một biến, hoặc b) làm cho chỉ mục 'hằng số' thành một biến. Do đó:

extern type extern_array []; extern_array [1] -> {volatile type * t = extern_array; t [1]}

hoặc là

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

Đối với các cấu trúc (và hầu hết các kiểu dữ liệu multiword khác), tùy chọn duy nhất là tạo biến cấu trúc (hoặc biến dài, hoặc biến ...):

extern struct s extern_struct; extern_struct.field -> {volatile struct s * t = & extern_struct; t-> field}

hoặc là

extern long long extern_ll; extern_ll -> {volatile long long * local_ll = & extern_ll; * local_ll}

Phương pháp thứ ba đối phó với khó khăn này là từ bỏ 'tự động nhập' cho biểu tượng vi phạm và đánh dấu nó bằng "__declspec (dllimport)". Tuy nhiên, trong thực tế, yêu cầu sử dụng #defines biên dịch để cho biết bạn đang xây dựng một DLL, xây dựng mã máy khách sẽ liên kết đến DLL hay chỉ xây dựng / liên kết đến một thư viện tĩnh. Khi đưa ra lựa chọn giữa các phương pháp khác nhau để giải quyết vấn đề 'địa chỉ trực tiếp với bù không đổi', bạn nên xem xét việc sử dụng thực tế điển hình:

Nguyên:

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

Giải pháp 1:

--foo.h extern int arr []; --foo.c #include "foo.h" void main (int argc, char ** argv) {/ * Cách giải quyết này là dành cho win32 và cygwin; không "tối ưu" * / volatile int * parr = arr; printf ("% d \ n", parr [1]); }

Giải pháp 2:

--foo.h / * Lưu ý: tự động xuất được giả định (không __declspec (dllexport)) * / #if (được xác định (_WIN32) || được xác định (__ CYGWIN__)) && \! (được định nghĩa (FOO_BUILD_DLL) || được định nghĩa (FOO_STATIC) )) #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]); }

Cách thứ tư để tránh vấn đề này là mã lại thư viện của bạn để sử dụng giao diện chức năng hơn là giao diện dữ liệu cho các biến vi phạm (ví dụ: hàm set_foo ()get_foo () ).

- tự động nhập

Đừng cố gắng thực hiện liên kết nhị phân "_symbol" với "__imp__symbol" cho DATAimports từ các tệp DLL.

--enable-runtime-pseudo-reloc

Nếu mã của bạn chứa các biểu thức được mô tả trong phần --enable-auto-import, có nghĩa là, DATAimports từ DLL có offset khác, chuyển đổi này sẽ tạo ra một vec tơ 'thời gian chuyển đổi giả' có thể được môi trường thời gian chạy sử dụng để điều chỉnh tham chiếu cho dữ liệu đó trong mã khách hàng của bạn.

--disable-runtime-pseudo-reloc

Không tạo các chuyển vị giả cho các giá trị DATA không bù đắp từ các DLL. Đây là mặc định.

--enable-extra-pe-debug

Hiển thị thông tin gỡ lỗi bổ sung liên quan đến việc tách biểu tượng tự động nhập.

- alignment-alignment

Đặt căn chỉnh phần. Các phần trong bộ nhớ sẽ luôn bắt đầu tại các địa chỉ là bội số của số này. Mặc định là 0x1000.

- dự trữ

--đặt dự trữ , cam kết

Chỉ định số lượng bộ nhớ để dự trữ (và tùy chọn cam kết) được sử dụng làm ngăn xếp cho chương trình này. Giá trị mặc định là 2Mb, 4K cam kết.

--subsystem

--subsystem : major

--subsystem đó : major . diễn viên phụ

Chỉ định hệ thống phụ mà theo đó chương trình của bạn sẽ thực thi. Các giá trị pháp lý cho "native", "windows", "console" và "posix". Bạn cũng có thể tùy chọn thiết lập phiên bản hệ thống phụ.

Quan trọng: Sử dụng lệnh man ( % man ) để xem cách một lệnh được sử dụng trên máy tính cụ thể của bạn.