Linux / Unix Command: Id

NAMA

ld - Menggunakan LD , tautan GNU

RINGKASAN

ld [ opsi ] objfile ...

DESKRIPSI

ld menggabungkan sejumlah objek dan file arsip, memindahkan data mereka dan mengikat referensi simbol. Biasanya langkah terakhir dalam menyusun program adalah menjalankan ld .

ld menerima file Linker Command Language yang ditulis dalam superset dari sintaks Command Command Language Syntax AT & T, untuk memberikan kontrol eksplisit dan total atas proses penautan.

Halaman manual ini tidak menggambarkan bahasa perintah; lihat entri ld di "info", atau ld manual: tautan GNU , untuk perincian lengkap tentang bahasa perintah dan aspek-aspek lain dari penghubung GNU.

Versi ini menggunakan pustaka BFD tujuan umum untuk beroperasi pada file objek. Hal ini memungkinkan ld untuk membaca, menggabungkan, dan menulis file objek dalam berbagai format berbeda --- misalnya, COFF atau "a.out". Format yang berbeda dapat dihubungkan bersama untuk menghasilkan jenis file objek yang tersedia.

Selain fleksibilitasnya, tautan GNU lebih bermanfaat daripada penghubung lain dalam memberikan informasi diagnostik. Banyak penghubung meninggalkan eksekusi segera setelah menghadapi kesalahan; sedapat mungkin, ld terus mengeksekusi, memungkinkan Anda untuk mengidentifikasi kesalahan lain (atau, dalam beberapa kasus, untuk mendapatkan file output terlepas dari kesalahan).

The GNU linker ld dimaksudkan untuk mencakup berbagai situasi, dan menjadi serelevan mungkin dengan linker lainnya. Akibatnya, Anda memiliki banyak pilihan untuk mengendalikan perilakunya.

PILIHAN

Linker mendukung banyak opsi baris perintah , tetapi dalam prakteknya beberapa dari mereka digunakan dalam konteks tertentu. Sebagai contoh, penggunaan ld yang sering dilakukan adalah menghubungkan file objek Unix standar pada sistem Unix standar yang didukung. Pada sistem seperti itu, untuk menautkan file "hello.o":

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

Ini memberitahu ld untuk menghasilkan file yang disebut output sebagai hasil dari menghubungkan file "/lib/crt0.o" dengan "hello.o" dan perpustakaan "libc.a", yang akan berasal dari direktori pencarian standar. (Lihat pembahasan opsi -l di bawah ini.)

Beberapa opsi baris perintah ke ld dapat ditentukan pada titik mana pun dalam baris perintah. Namun, opsi yang merujuk ke file, seperti -l atau -T , menyebabkan file dibaca pada titik di mana opsi muncul di baris perintah, relatif terhadap file objek dan opsi file lainnya. Mengulangi opsi non-file dengan argumen yang berbeda tidak akan memiliki efek lebih lanjut, atau mengganti kejadian sebelumnya (yang lebih jauh ke kiri pada baris perintah) dari opsi itu. Opsi yang dapat ditentukan secara bermakna lebih dari sekali dicatat dalam uraian di bawah ini.

Argumen non-opsi adalah file objek atau arsip yang harus dihubungkan bersama. Mereka mungkin mengikuti, mendahului, atau dicampur dengan opsi baris perintah, kecuali bahwa argumen file objek tidak dapat ditempatkan di antara opsi dan argumennya.

Biasanya linker dipanggil dengan setidaknya satu file objek, tetapi Anda dapat menentukan bentuk lain dari file input biner menggunakan -l , -R , dan bahasa perintah skrip. Jika tidak ada file input biner sama sekali ditentukan, linker tidak menghasilkan output apapun, dan masalah pesan Tidak ada file input .

Jika linker tidak dapat mengenali format file objek, itu akan menganggap bahwa itu adalah skrip linker. Skrip yang ditentukan dengan cara ini menambah skrip tautan utama yang digunakan untuk tautan (baik skrip tautan default atau yang ditentukan dengan menggunakan -T ). Fitur ini memungkinkan penaut untuk menautkan ke file yang tampak sebagai objek atau arsip, tetapi sebenarnya hanya mendefinisikan beberapa nilai simbol, atau menggunakan "INPUT" atau "GROUP" untuk memuat objek lain. Perhatikan bahwa menentukan skrip dengan cara ini hanya menambah skrip tautan utama; gunakan opsi -T untuk mengganti skrip linker default sepenuhnya.

Untuk opsi yang namanya adalah huruf tunggal, argumen opsi harus mengikuti huruf opsi tanpa spasi campur, atau diberikan sebagai argumen terpisah segera mengikuti opsi yang mengharuskannya.

Untuk opsi yang namanya berupa banyak huruf, baik satu atau dua garis dapat mendahului nama opsi; misalnya, -trace-simbol dan --trace-simbol adalah setara. Catatan - ada satu pengecualian untuk aturan ini. Beberapa opsi huruf yang dimulai dengan huruf kecil 'o' hanya dapat diawali dengan dua tanda hubung. Ini untuk mengurangi kebingungan dengan opsi -o . Jadi misalnya -omagic menetapkan nama file output ke magic sedangkan --omagic menyetel flag NMAGIC pada output.

Argumen ke opsi multi-huruf harus dipisahkan dari nama opsi dengan tanda yang sama, atau diberikan sebagai argumen terpisah segera mengikuti opsi yang membutuhkannya. Misalnya, - foo simbol-simbol dan --trace-simbol = foo ekuivalen. Singkatan unik dari nama-nama opsi multi-huruf diterima.

Catatan - jika linker sedang dipanggil secara tidak langsung, melalui driver kompilator (misalnya gcc ) maka semua opsi baris perintah linker harus diawali oleh -Wl, (atau apa pun yang sesuai untuk driver compiler tertentu) seperti ini:

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

Ini penting, karena jika tidak, program driver kompilator dapat secara diam-diam menjatuhkan opsi tautan, menghasilkan tautan yang buruk.

Berikut ini adalah tabel saklar baris perintah generik yang diterima oleh tautan GNU:

-kata kunci

Opsi ini didukung untuk kompatibilitas HP / UX. Argumen kata kunci harus berupa salah satu arsip string , bersama , atau default . -arsipik secara fungsional setara dengan -Bstatic , dan dua kata kunci lainnya secara fungsional setara dengan -Bdynamic . Pilihan ini dapat digunakan beberapa kali.

- Arsitektur

--arsitektur = arsitektur

Dalam rilis ld saat ini, opsi ini hanya berguna untuk keluarga arsitektur Intel 960. Dalam konfigurasi ld itu , argumen arsitektur mengidentifikasi arsitektur tertentu dalam 960 keluarga, memungkinkan beberapa pengamanan dan memodifikasi jalur pencarian arsip-perpustakaan.

Rilis mendatang dari ld dapat mendukung fungsi serupa untuk keluarga arsitektur lainnya.

-b input-format

--format = format input

ld dapat dikonfigurasi untuk mendukung lebih dari satu jenis file objek. Jika ld Anda dikonfigurasi dengan cara ini, Anda dapat menggunakan opsi -b untuk menentukan format biner untuk file objek masukan yang mengikuti opsi ini pada baris perintah. Bahkan ketika ld dikonfigurasi untuk mendukung format objek alternatif, Anda biasanya tidak perlu menentukan ini, karena ld harus dikonfigurasi untuk mengharapkan sebagai format input default format yang paling umum pada setiap mesin. format input adalah string teks, nama format tertentu yang didukung oleh pustaka BFD. (Anda dapat daftar format biner yang tersedia dengan objdump -i .)

Anda mungkin ingin menggunakan opsi ini jika Anda menautkan file dengan format biner yang tidak biasa. Anda juga dapat menggunakan -b untuk berganti format secara eksplisit (saat menautkan file objek dari berbagai format), dengan memasukkan -b input-format sebelum setiap kelompok file objek dalam format tertentu.

Format default diambil dari variabel lingkungan "GNUTARGET".

Anda juga dapat menentukan format input dari skrip, menggunakan perintah "TARGET";

-c MRI-commandfile

--mri-script = MRI-commandfile

Untuk kompatibilitas dengan penghubung yang dihasilkan oleh MRI, ld menerima file skrip yang ditulis dalam bahasa perintah alternatif yang terbatas, yang dijelaskan di bagian File Skrip Kompatibel MRI pada dokumentasi GNU ld. Memperkenalkan file skrip MRI dengan opsi -c ; gunakan opsi -T untuk menjalankan skrip tautan yang ditulis dalam bahasa skrip tujuan umum. Jika MRI-cmdfile tidak ada, ld mencarinya di direktori yang ditentukan oleh opsi -L .

-d

-dc

-dp

Ketiga opsi ini setara; berbagai bentuk didukung untuk kompatibilitas dengan penghubung lainnya. Mereka memberikan ruang untuk simbol-simbol umum bahkan jika file output relocatable ditentukan (dengan -r ). Perintah skrip "FORCE_COMMON_ALLOCATION" memiliki efek yang sama.

-e entri

--entry = entry

Gunakan entri sebagai simbol eksplisit untuk memulai pelaksanaan program Anda, daripada titik masuk default. Jika tidak ada entri bernama simbol, penaut akan mencoba mengurai entri sebagai angka, dan menggunakannya sebagai alamat entri (nomor akan ditafsirkan dalam basis 10; Anda dapat menggunakan 0x terkemuka untuk basis 16, atau 0 untuk basis 8).

-E

--ekspor-dinamis

Saat membuat executable yang terhubung secara dinamis, tambahkan semua simbol ke tabel simbol dinamis. Tabel simbol dinamis adalah himpunan simbol yang terlihat dari objek dinamis pada waktu proses.

Jika Anda tidak menggunakan opsi ini, tabel simbol dinamis biasanya hanya berisi simbol-simbol yang direferensikan oleh beberapa objek dinamis yang disebutkan dalam tautan.

Jika Anda menggunakan "dlopen" untuk memuat objek dinamis yang perlu merujuk kembali ke simbol yang ditentukan oleh program, daripada objek dinamis lainnya, maka Anda mungkin perlu menggunakan opsi ini ketika menautkan program itu sendiri.

Anda juga dapat menggunakan skrip versi untuk mengontrol simbol apa yang harus ditambahkan ke tabel simbol dinamis jika format output mendukungnya. Lihat deskripsi --version-script di @ ref {VERSION}.

-EB

Tautkan objek big-endian. Ini mempengaruhi format output default.

-EL

Tautkan objek little-endian. Ini mempengaruhi format output default.

-f

- Nama lain

Saat membuat objek bersama ELF, setel field DT_AUXILIARY internal ke nama yang ditentukan. Ini memberitahu linker dinamis bahwa tabel simbol objek bersama harus digunakan sebagai filter tambahan pada tabel simbol dari nama objek yang dibagikan.

Jika nantinya Anda menautkan program terhadap objek filter ini, maka, ketika Anda menjalankan program, tautan dinamis akan melihat bidang DT_AUXILIARY. Jika penaut dinamis menyelesaikan simbol apa pun dari objek filter, pertama-tama akan memeriksa apakah ada definisi dalam nama objek bersama. Jika ada, itu akan digunakan sebagai pengganti definisi dalam objek filter. Nama objek yang dibagikan tidak perlu ada. Jadi nama objek yang dipakai bersama dapat digunakan untuk menyediakan implementasi alternatif fungsi-fungsi tertentu, mungkin untuk debugging atau untuk kinerja spesifik mesin.

Opsi ini dapat ditentukan lebih dari satu kali. Entri DT_AUXILIARY akan dibuat sesuai urutan kemunculannya di baris perintah.

Nama -F

--file filter

Saat membuat objek bersama ELF, setel field DT_FILTER internal ke nama yang ditentukan. Ini memberitahu linker dinamis bahwa tabel simbol dari objek bersama yang sedang dibuat harus digunakan sebagai filter pada tabel simbol dari nama objek yang dibagikan.

Jika nantinya Anda menghubungkan program terhadap objek filter ini, maka, ketika Anda menjalankan program, tautan dinamis akan melihat bidang DT_FILTER. Linker dinamis akan menyelesaikan simbol sesuai dengan tabel simbol dari objek filter seperti biasa, tetapi itu akan benar-benar terkait dengan definisi yang ditemukan dalam nama objek bersama. Dengan demikian objek filter dapat digunakan untuk memilih subset dari simbol-simbol yang disediakan oleh nama objek.

Beberapa penghubung lama menggunakan opsi -F di seluruh toolchain kompilasi untuk menentukan format objek-file untuk kedua file objek input dan output. Linker GNU menggunakan mekanisme lain untuk tujuan ini: opsi -b , --format , --oformat , perintah "TARGET" dalam skrip tautan, dan variabel lingkungan "GNUTARGET". Linker GNU akan mengabaikan opsi -F ketika tidak membuat objek bersama ELF.

nama -fini

Saat membuat objek yang dapat dieksekusi atau dibagikan ELF, hubungi NAME ketika objek yang dapat dijalankan atau dibagikan dibongkar, dengan mengatur DT_FINI ke alamat fungsi. Secara default, tautan menggunakan "_fini" sebagai fungsi untuk dipanggil.

-g

Diabaikan. Disediakan untuk kompatibilitas dengan alat lain.

Nilai -G

--gpsize = nilai

Atur ukuran maksimum objek yang akan dioptimalkan menggunakan register GP ke ukuran . Ini hanya bermakna untuk format file objek seperti MIPS ECOFF yang mendukung menempatkan objek besar dan kecil ke dalam bagian yang berbeda. Ini diabaikan untuk format file objek lain.

nama -h

-merama = nama

Saat membuat objek bersama ELF, setel field DT_SONAME internal ke nama yang ditentukan. Ketika sebuah executable terhubung dengan objek bersama yang memiliki field DT_SONAME, maka ketika executable menjalankan linker dinamis akan mencoba untuk memuat objek bersama yang ditentukan oleh field DT_SONAME daripada menggunakan nama file yang diberikan ke linker.

-saya

Lakukan tautan inkremental (sama dengan opsi -r ).

-init nama

Saat membuat objek yang dapat dieksekusi atau dibagikan ELF, hubungi NAME ketika objek yang dapat dijalankan atau dibagikan dimuat, dengan mengatur DT_INIT ke alamat fungsi tersebut. Secara default, penghubung menggunakan "_init" sebagai fungsi untuk dipanggil.

arsip -l

--library = arsip

Tambahkan arsip arsip file ke daftar file untuk ditautkan. Pilihan ini dapat digunakan beberapa kali. ld akan mencari daftar jalurnya untuk kejadian "libarchive.a" untuk setiap arsip yang ditentukan.

Pada sistem yang mendukung pustaka bersama, ld juga dapat mencari pustaka dengan ekstensi selain ".a". Secara khusus, pada sistem ELF dan SunOS, ld akan mencari direktori untuk pustaka dengan ekstensi ".so" sebelum mencari yang memiliki ekstensi ".a". Dengan konvensi, ekstensi ".so" menunjukkan pustaka bersama.

Linker hanya akan mencari arsip satu kali, di lokasi yang ditentukan pada baris perintah. Jika arsip mendefinisikan simbol yang tidak terdefinisi di beberapa objek yang muncul sebelum arsip pada baris perintah, penghubung akan menyertakan file yang sesuai dari arsip. Namun, simbol yang tidak terdefinisi dalam objek yang muncul kemudian di baris perintah tidak akan menyebabkan linker untuk mencari arsip lagi.

Lihat - ( opsi untuk cara memaksa penaut untuk mencari arsip beberapa kali.

Anda dapat mencantumkan arsip yang sama beberapa kali pada baris perintah.

Jenis pencarian arsip ini adalah standar untuk penghubung Unix. Namun, jika Anda menggunakan ld onAIX, perhatikan bahwa itu berbeda dari perilaku linker AIX.

-L searchdir

--library-path = searchdir

Tambahkan path searchdir ke daftar jalur yang akan dicari untuk pustaka arsip dan skrip kontrol ld . Anda dapat menggunakan opsi ini beberapa kali. Direktori dicari dalam urutan di mana mereka ditentukan pada baris perintah. Direktori yang ditentukan pada baris perintah dicari sebelum direktori default. Semua opsi -L berlaku untuk semua opsi -l , terlepas dari urutan di mana opsi muncul.

Jika searchdir diawali dengan "=", maka "=" akan digantikan oleh awalan sysroot , jalur yang ditentukan ketika tautan dikonfigurasikan.

Kumpulan jalur standar yang dicari (tanpa ditentukan dengan -L ) tergantung pada mode emulasi yang digunakan oleh ld , dan dalam beberapa kasus juga tentang cara pengaturannya.

Jalur juga dapat ditentukan dalam skrip tautan dengan perintah "SEARCH_DIR". Direktori yang ditentukan dengan cara ini dicari pada titik di mana skrip linker muncul di baris perintah.

emulasi -m

Tiru tautan emulasi . Anda dapat mencantumkan emulasi yang tersedia dengan opsi --verbose atau -V .

Jika opsi- m tidak digunakan, emulasi diambil dari variabel lingkungan "LDEMULATION", jika itu didefinisikan.

Jika tidak, emulasi default tergantung pada bagaimana linker dikonfigurasi.

-M

--print-map

Cetak peta tautan ke output standar. Peta tautan memberikan informasi tentang tautan, termasuk yang berikut:

*

Di mana file objek dan simbol dipetakan ke dalam memori.

*

Bagaimana simbol umum dialokasikan.

*

Semua anggota arsip termasuk dalam tautan, dengan menyebutkan simbol yang menyebabkan anggota arsip dibawa masuk.

-n

- Nagagic

Matikan penyelarasan halaman bagian, dan tandai output sebagai "NMAGIC" jika memungkinkan.

-N

--omagik

Atur bagian teks dan data agar dapat dibaca dan ditulis. Juga, jangan halaman-sejajarkan segmen data, dan nonaktifkan menghubungkan terhadap pustaka bersama. Jika format output mendukung angka ajaib gaya Unix, tandai output sebagai "OMAGIC".

--no-omagic

Opsi ini meniadakan sebagian besar efek opsi -N . Ini menetapkan bagian teks menjadi hanya-baca, dan memaksa segmen data untuk diselaraskan halaman. Catatan - opsi ini tidak memungkinkan menautkan ke pustaka bersama. Gunakan -Bdynamic untuk ini.

-o output

--output = output

Gunakan output sebagai nama untuk program yang dihasilkan oleh ld ; jika opsi ini tidak ditentukan, nama a.out digunakan secara default. Perintah skrip "OUTPUT" juga dapat menentukan nama file output.

Tingkat -O

Jika tingkat adalah nilai numerik yang lebih besar dari nol ld mengoptimalkan output. Ini mungkin membutuhkan waktu lebih lama dan oleh karena itu mungkin seharusnya hanya diaktifkan untuk biner akhir.

-q

--emit-relocs

Tinggalkan bagian relokasi dan konten dalam executable yang sepenuhnya terhubung. Analisis tautan pos dan alat pengoptimalan mungkin memerlukan informasi ini untuk melakukan modifikasi yang benar dari yang dapat dijalankan. Ini menghasilkan executable yang lebih besar.

Opsi ini saat ini hanya didukung pada platform ELF.

-r

- Relocateable

Hasilkan keluaran relocatable --- yaitu, menghasilkan file output yang pada gilirannya berfungsi sebagai input ke ld . Ini sering disebut sebagai penautan parsial . Sebagai efek samping, di lingkungan yang mendukung angka ajaib Unix standar, opsi ini juga menetapkan angka ajaib file output ke "OMAGIC". Jika opsi ini tidak ditentukan, file mutlak dihasilkan. Ketika menghubungkan program C ++, opsi ini tidak akan menyelesaikan referensi ke konstruktor; untuk melakukan itu, gunakan -Ur .

Ketika file input tidak memiliki format yang sama dengan file output, penautan sebagian hanya didukung jika file input tidak berisi relokasi apa pun. Format output yang berbeda dapat memiliki pembatasan lebih lanjut; misalnya beberapa format "a.out" berbasis tidak mendukung penautan parsial dengan file input dalam format lain sama sekali.

Opsi ini melakukan hal yang sama dengan -i .

Nama file -R

--just-symbols = filename

Baca nama simbol dan alamatnya dari nama file , tetapi jangan memindahkannya atau memasukkannya ke dalam output. Ini memungkinkan file output Anda untuk merujuk secara simbolis ke lokasi absolut dari memori yang ditentukan dalam program lain. Anda dapat menggunakan opsi ini lebih dari satu kali.

Untuk kompatibilitas dengan penghubung ELF lainnya, jika opsi -R diikuti oleh nama direktori, daripada nama file, itu diperlakukan sebagai opsi -runt .

-s

--strip-semua

Hilangkan semua informasi simbol dari file output.

-S

--strip-debug

Hilangkan informasi simbol debugger (tetapi tidak semua simbol) dari file output.

-t

--jejak

Cetak nama file input saat ld memprosesnya.

-T skripfile

--script = scriptfile

Gunakan scriptfile sebagai skrip tautan. Skrip ini menggantikan skrip linker ld (daripada menambahkannya), jadi commandfile harus menentukan semua yang diperlukan untuk menggambarkan file output. Jika scriptfile tidak ada di direktori saat ini, "ld" mencarinya di direktori yang ditentukan oleh opsi -L sebelumnya. Berbagai opsi -T terakumulasi.

-u simbol

--undefined = simbol

Memaksa simbol untuk dimasukkan dalam file output sebagai simbol yang tidak terdefinisi. Melakukan hal ini dapat, misalnya, memicu penautan modul tambahan dari pustaka standar. -u dapat diulang dengan argumen opsi yang berbeda untuk memasukkan simbol tidak terdefinisi tambahan. Opsi ini sama dengan perintah skrip tautan "EXTERN".

-Ur

Untuk apa pun selain program C ++, opsi ini setara dengan -r : ia menghasilkan keluaran relocatable --- yaitu file keluaran yang pada gilirannya berfungsi sebagai masukan ke ld . Ketika menghubungkan program C ++, -Ur tidak menyelesaikan referensi ke konstruktor, tidak seperti -r . Tidak berfungsi untuk menggunakan -Ur pada file yang terkait dengan -Ur ; setelah meja konstruktor telah dibangun, itu tidak dapat ditambahkan. Gunakan -Ur hanya untuk tautan parsial terakhir, dan -r untuk yang lain.

--unique [= SECTION ]

Menciptakan bagian output terpisah untuk setiap bagian masukan yang cocok dengan BAGIAN , atau jika argumen wildcard opsional tidak ada, untuk setiap bagian masukan yatim piatu. Bagian anak yatim adalah bagian yang tidak disebutkan secara khusus dalam skrip tautan. Anda dapat menggunakan opsi ini beberapa kali pada baris perintah; Ini mencegah penggabungan normal bagian input dengan nama yang sama, mengesampingkan tugas bagian keluaran dalam skrip tautan.

-v

--versi

-V

Tampilkan nomor versi untuk ld . Opsi -V juga mencantumkan emulasi yang didukung.

-x

--discard-semua

Hapus semua simbol lokal.

-X

--discard-penduduk setempat

Hapus semua simbol lokal sementara. Untuk sebagian besar target, ini semua simbol lokal yang namanya dimulai dengan L.

-simbol

--trace-simbol = simbol

Cetak nama setiap file yang tertaut di mana simbol muncul. Pilihan ini dapat diberikan beberapa kali. Pada banyak sistem perlu untuk menambahkan garis bawah.

Opsi ini berguna ketika Anda memiliki simbol yang tidak terdefinisi di tautan Anda tetapi tidak tahu dari mana referensi itu berasal.

Jalur -Y

Tambahkan jalur ke jalur pencarian perpustakaan default. Opsi ini ada untuk kompatibilitas Solaris.

kata kunci -z

Kata kunci yang dikenal adalah "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "sekarang", "origin", "combreloc", "nocombreloc" dan "nocopyreloc ". Kata kunci lainnya diabaikan untuk kompatibilitas Solaris. "initfirst" menandai objek yang akan diinisialisasi terlebih dahulu pada waktu proses sebelum objek lain. "Interpose" menandai objek yang tabel simbolnya bergantian sebelum semua simbol tetapi dieksekusi utama. "loadfltr" menandai objek yang filtanya diproses segera saat runtime. "nodefaultlib" menandai objek yang mencari dependensi objek ini akan mengabaikan jalur penelusuran perpustakaan default apa pun. "nodelete" menandai objek seharusnya tidak diturunkan saat runtime. "nodlopen" menandai objek tidak tersedia untuk "dlopen". "nodump" menandai objek tidak dapat dibuang oleh "dldump". "sekarang" menandai objek dengan non-malas runtime binding. "origin" menandai objek mungkin mengandung $ ASAL. "Def" tidak mengizinkan simbol yang tidak terdefinisi. "muldefs" memungkinkan beberapa definisi. "combreloc" menggabungkan beberapa bagian reloc dan mengurutkan mereka untuk membuat pencarian simbol dinamis mungkin.

"nocombreloc" menonaktifkan penggabungan beberapa bagian relokasi. "nocopyreloc" menonaktifkan produksi copy relocs.

- ( arsip -)

--start-group archives --end-group

Arsip harus berupa daftar file arsip . Mereka mungkin berupa nama file eksplisit, atau opsi -l .

Arsip yang ditentukan dicari berulang kali hingga tidak ada referensi baru yang tidak ditentukan yang dibuat. Biasanya, arsip hanya dicari satu kali dalam urutan yang ditentukan pada baris perintah. Jika simbol dalam arsip itu diperlukan untuk menyelesaikan simbol yang tidak ditentukan yang dirujuk oleh objek dalam arsip yang muncul kemudian di baris perintah, penaut tidak akan dapat menyelesaikan referensi itu. Dengan mengelompokkan arsip, mereka semua dicari berulang kali hingga semua referensi yang memungkinkan diselesaikan.

Menggunakan opsi ini memiliki biaya kinerja yang signifikan. Yang terbaik adalah menggunakannya hanya ketika ada referensi melingkar yang tidak dapat dihindari antara dua atau lebih arsip.

- menerima-tidak dikenal-masukan-lengkungan

--no-accept-unknown-input-arch

Memberi tahu penaut untuk menerima file masukan yang arsitekturnya tidak dapat dikenali. Asumsinya adalah bahwa pengguna tahu apa yang mereka lakukan dan sengaja ingin menghubungkan dalam file input yang tidak dikenal ini. Ini adalah perilaku default dari tautan, sebelum rilis 2.14. Perilaku default dari rilis 2.14 dan seterusnya adalah menolak file input seperti itu, dan karena itu opsi - accept-unknown-input-arch telah ditambahkan untuk mengembalikan perilaku lama.

-menambahkan kata kunci

Opsi ini diabaikan untuk kompatibilitas SunOS .

-Bdynamic

-dy

-call_shared

Tautan dengan pustaka dinamis. Ini hanya berarti pada platform yang didukung perpustakaan bersama . Opsi ini biasanya merupakan default pada platform tersebut. Variasi yang berbeda dari opsi ini adalah untuk kompatibilitas dengan berbagai sistem. Anda dapat menggunakan opsi ini beberapa kali pada baris perintah: itu mempengaruhi pencarian perpustakaan untuk opsi -l yang mengikutinya.

-Bgroup

Setel bendera "DF_1_GROUP" di entri "DT_FLAGS_1" di bagian dinamis. Hal ini menyebabkan linker runtime untuk menangani pencarian di objek ini dan dependensinya hanya dilakukan di dalam grup. --no-undefined tersirat. Opsi ini hanya berarti pada platform ELF yang mendukung pustaka bersama .

-Bstatic

-dn

-non_shared

-statis

Jangan tautkan ke pustaka bersama. Ini hanya berarti pada platform yang didukung perpustakaan bersama. Variasi yang berbeda dari opsi ini adalah untuk kompatibilitas dengan berbagai sistem. Anda dapat menggunakan opsi ini beberapa kali pada baris perintah: itu mempengaruhi pencarian perpustakaan untuk opsi -l yang mengikutinya.

-Bsymbolic

Saat membuat pustaka bersama, ikat referensi ke simbol global ke definisi dalam pustaka bersama, jika ada. Biasanya, adalah mungkin untuk program yang terkait dengan perpustakaan bersama untuk mengesampingkan definisi dalam pustaka bersama. Opsi ini hanya berarti pada ELFplatform yang mendukung pustaka bersama.

--Check-bagian

--tidak ada-periksa-bagian

Minta penghubung untuk tidak memeriksa alamat bagian setelah mereka ditugaskan untuk melihat apakah ada tumpang tindih. Biasanya linker akan melakukan pemeriksaan ini, dan jika ditemukan ada tumpang tindih maka akan menghasilkan pesan kesalahan yang sesuai. Linker tidak tahu tentang, dan memang membuat tunjangan untuk bagian dalam overlay. Perilaku default dapat dipulihkan dengan menggunakan saklar baris perintah - centang-bagian .

--cref

Output tabel referensi silang. Jika file peta tautan dibuat, tabel referensi silang dicetak ke file peta. Jika tidak, dicetak pada output standar.

Format tabel sengaja dibuat sederhana, sehingga mudah diproses oleh skrip jika perlu. Simbol tersebut dicetak, diurutkan berdasarkan nama. Untuk setiap simbol, daftar nama file diberikan. Jika simbol didefinisikan, file pertama yang terdaftar adalah lokasi definisi. Sisa file berisi referensi ke simbol.

--no-define-common

Opsi ini menghambat penugasan alamat ke simbol umum. Perintah skrip "INHIBIT_COMMON_ALLOCATION" memiliki efek yang sama.

Opsi --no-define-common memungkinkan decoupling keputusan untuk menetapkan alamat ke simbol umum dari pilihan jenis file output; jika tidak, tipe gaya output yang tidak dapat Relocatable menetapkan alamat ke simbol-simbol umum. Menggunakan --no-define-common memungkinkan simbol-simbol umum yang direferensikan dari pustaka bersama akan diberi alamat hanya dalam program utama. Ini menghilangkan ruang duplikat yang tidak digunakan dalam pustaka bersama, dan juga mencegah kemungkinan kebingungan untuk menyelesaikan ke duplikat yang salah ketika ada banyak modul dinamis dengan jalur pencarian khusus untuk resolusi simbol runtime.

--defsym simbol = ekspresi

Buat simbol global dalam file output, yang berisi alamat absolut yang diberikan oleh ekspresi . Anda dapat menggunakan opsi ini sebanyak yang diperlukan untuk menentukan beberapa simbol di baris perintah. Bentuk terbatas aritmatika didukung untuk ekspresi dalam konteks ini: Anda dapat memberikan konstanta heksadesimal atau nama simbol yang ada, atau gunakan "+" dan "-" untuk menambah atau mengurangi konstanta atau simbol heksadesimal. Jika Anda membutuhkan ekspresi yang lebih rumit, pertimbangkan untuk menggunakan bahasa perintah tautan dari skrip. Catatan: seharusnya tidak ada spasi di antara simbol , tanda sama dengan (`` = ''), dan ekspresi .

--membuat [= gaya ]

--no-demangle

Opsi-opsi ini mengontrol apakah akan mencabut nama simbol dalam pesan kesalahan dan keluaran lainnya. Ketika linker diperintahkan untuk demangle, ia mencoba untuk menyajikan nama simbol dengan cara yang dapat dibaca: itu strip yang menggarisbawahi garis bawah jika mereka digunakan oleh format file objek, dan mengkonversi C + + nama simbol melengkung ke nama yang dapat dibaca pengguna. Kompiler yang berbeda memiliki gaya pengawetan yang berbeda. Argumen gaya demassling opsional dapat digunakan untuk memilih gaya demangling yang sesuai untuk compiler Anda. Linker akan dihapus secara default kecuali jika variabel lingkungan COLLECT_NO_DEMANGLE diatur. Opsi ini dapat digunakan untuk mengganti default.

- file dinamis-linker

Setel nama tautan dinamis. Ini hanya bermakna ketika menghasilkan ELIC executable yang terhubung secara dinamis. Linker dinamis default biasanya benar; jangan gunakan ini kecuali Anda tahu apa yang Anda lakukan.

--embedded-relocs

Pilihan ini hanya bermakna ketika menghubungkan kode PIC tertanam MIPS, yang dihasilkan oleh opsi -membedded-pic ke kompilator GNU dan assembler. Ini menyebabkan linker untuk membuat tabel yang dapat digunakan saat runtime untuk merelokasi data apa pun yang diinisialisasi secara statis ke nilai penunjuk. Lihat kode di testsuite / ld-empic untuk detailnya.

- peringatan fatal

Perlakukan semua peringatan sebagai kesalahan .

--force-exe-suffix

Pastikan bahwa file output memiliki akhiran .exe.

Jika file output yang terhubung penuh berhasil tidak memiliki ". Exe " atau " .dll " akhiran, opsi ini memaksa penaut untuk menyalin file output ke salah satu dari nama yang sama dengan akhiran ".exe". Opsi ini berguna ketika menggunakan makefile Unix yang tidak dimodifikasi pada host Microsoft Windows, karena beberapa versi Windows tidak akan menjalankan gambar kecuali akhiran ".exe".

--no-gc-sections

--gc-sections

Aktifkan pengumpulan sampah dari bagian masukan yang tidak digunakan. Ini diabaikan pada target yang tidak mendukung opsi ini. Opsi ini tidak kompatibel dengan -r , atau seharusnya digunakan dengan penautan dinamis. Perilaku default (tidak melakukan pengumpulan sampah ini) dapat dipulihkan dengan menentukan --no-gc-sections pada baris perintah.

--membantu

Cetak ringkasan opsi baris perintah pada keluaran standar dan keluar.

--target-help

Cetak ringkasan semua opsi spesifik target pada output standar dan keluar.

Peta- mapfile

Cetak peta tautan ke file mapfile . Lihat deskripsi opsi -M , di atas.

--no-keep-memory

ld biasanya mengoptimalkan kecepatan penggunaan memori dengan menyimpan tabel simbol dari file input ke dalam memori. Opsi ini memberitahu ld untuk mengoptimalkan penggunaan memori, dengan membaca ulang tabel simbol seperlunya. Ini mungkin diperlukan jika ld kehabisan ruang memori saat menautkan eksekusi besar.

--no-undefined

-z def

Biasanya saat membuat pustaka bersama non-simbolik, simbol yang tidak ditentukan diizinkan dan dibiarkan untuk diselesaikan oleh pemuat waktu proses. Opsi ini tidak mengizinkan simbol yang tidak terdefinisi seperti itu.

--allow-multiple-definition

-z muldefs

Biasanya ketika simbol didefinisikan beberapa kali, penaut akan melaporkan kesalahan fatal. Opsi-opsi ini memungkinkan beberapa definisi dan definisi pertama akan digunakan.

--allow-shlib-undefined

Izinkan simbol yang tidak terdefinisi dalam objek bersama bahkan ketika --no-undefined ditetapkan. Hasil akhirnya adalah simbol yang tidak terdefinisi dalam objek biasa akan tetap memicu kesalahan, tetapi simbol yang tidak didefinisikan dalam objek bersama akan diabaikan. Implementasi no_undefined membuat asumsi bahwa linker runtime akan tersedak pada simbol yang tidak terdefinisi. Namun setidaknya ada satu sistem (BeOS) di mana simbol yang tidak didefinisikan dalam pustaka bersama adalah normal karena kernel menambalnya pada waktu pemuatan untuk memilih fungsi mana yang paling sesuai untuk arsitektur saat ini. IE secara dinamis memilih fungsi memset yang sesuai. Rupanya itu juga normal untuk pustaka yang dibagikan HPPA untuk memiliki simbol yang tidak terdefinisi.

--no-undefined-version

Biasanya ketika simbol memiliki versi tidak terdefinisi, linker akan mengabaikannya. Pilihan ini melarang simbol dengan versi tidak terdefinisi dan kesalahan fatal akan dikeluarkan sebagai gantinya.

--no-warn-mismatch

Biasanya ld akan memberikan kesalahan jika Anda mencoba untuk menghubungkan bersama-sama file input yang tidak cocok untuk beberapa alasan, mungkin karena mereka telah dikompilasi untuk prosesor yang berbeda atau untuk endianness yang berbeda. Opsi ini memberi tahu bahwa harus diam-diam mengizinkan kemungkinan kesalahan tersebut. Opsi ini hanya boleh digunakan dengan hati-hati, jika Anda telah melakukan beberapa tindakan khusus yang memastikan bahwa kesalahan tautan tidak pantas.

--no-whole-archive

Matikan efek opsi --seluruh-arsip untuk file arsip selanjutnya.

--noinhibit-exec

Simpan file output yang dapat dieksekusi kapan saja masih bisa digunakan. Biasanya, penaut tidak akan menghasilkan file output jika menemukan kesalahan selama proses tautan; itu keluar tanpa menulis file output ketika mengeluarkan kesalahan apa pun.

-nostdlib

Hanya mencari direktori perpustakaan yang secara eksplisit ditentukan pada baris perintah. Direktori perpustakaan yang ditentukan dalam skrip tautan (termasuk skrip tautan yang ditentukan pada baris perintah) diabaikan.

--format output-format

ld dapat dikonfigurasi untuk mendukung lebih dari satu jenis file objek. Jika ld Anda dikonfigurasi dengan cara ini, Anda dapat menggunakan opsi --oformat untuk menentukan format biner untuk file objek output. Bahkan ketika ld dikonfigurasi untuk mendukung format objek alternatif, Anda biasanya tidak perlu menentukan ini, karena ld harus dikonfigurasi untuk menghasilkan sebagai format output default format yang paling umum pada setiap mesin. format output adalah string teks, nama format tertentu yang didukung oleh pustaka BFD. (Anda dapat daftar format biner yang tersedia dengan objdump -i .) Perintah skrip "OUTPUT_FORMAT" juga dapat menentukan format output, tetapi opsi ini menimpanya.

-Qmagic

Opsi ini diabaikan untuk kompatibilitas Linux.

-Qy

Pilihan ini diabaikan untuk kompatibilitas SVR4.

--bersantai

Pilihan dengan efek yang tergantung pada mesin. Opsi ini hanya didukung pada beberapa target.

Pada beberapa platform, opsi --relax melakukan pengoptimalan global yang menjadi mungkin ketika penaut menyelesaikan pengalamatan dalam program, seperti mode alamat santai dan mensintesis instruksi baru dalam file objek keluaran.

Pada beberapa platform, pengoptimalan global waktu tautan ini dapat membuat debugging simbolis dari hasil yang tidak dapat dieksekusi. Hal ini dikenal sebagai kasus untuk keluarga prosesor Matsushita MN10200and MN10300.

Pada platform di mana ini tidak didukung, --relax diterima, tetapi diabaikan.

- nama file filen-simbol-file

Pertahankan hanya simbol yang tercantum dalam nama file file , buang semua yang lain. nama file hanyalah sebuah file datar, dengan satu nama simbol per baris. Opsi ini sangat berguna dalam lingkungan (seperti VxWorks) di mana tabel simbol global yang besar terakumulasi secara bertahap, untuk menghemat memori run-time.

--retain-simbol-file tidak membuang simbol yang tidak terdefinisi, atau simbol yang diperlukan untuk relokasi.

Anda hanya dapat menentukan --retain-simbol-file satu kali di baris perintah. Ini menimpa -s dan -S .

-rpath dir

Tambahkan direktori ke jalur pencarian perpustakaan runtime. Ini digunakan saat menautkan ELFexecutable dengan objek yang dibagikan. Semua argumen -rpath digabungkan dan diteruskan ke linker runtime, yang menggunakannya untuk mencari objek bersama saat runtime. Opsi -rpath juga digunakan saat mencari objek bersama yang dibutuhkan oleh objek bersama yang secara eksplisit termasuk dalam tautan; lihat deskripsi opsi -rpath-link . Jika -rpath tidak digunakan saat menautkan ELF yang dapat dieksekusi, isi variabel lingkungan "LD_RUN_PATH" akan digunakan jika sudah didefinisikan.

Opsi -rpath juga dapat digunakan pada SunOS. Secara default, pada SunOS, linker akan membentuk patch pencarian runtime dari semua opsi -L yang diberikan. Jika opsi -rpath digunakan, jalur pencarian runtime akan dibentuk secara eksklusif menggunakan opsi -runt , mengabaikan opsi -L . Ini dapat berguna ketika menggunakan gcc, yang menambahkan banyak opsi -L yang mungkin pada sistem file yang dipasang pada NFS.

Untuk kompatibilitas dengan penghubung ELF lainnya, jika opsi -R diikuti oleh nama direktori, daripada nama file, itu diperlakukan sebagai opsi -runt .

-rrc-link DIR

Saat menggunakan ELF atau SunOS, satu pustaka bersama mungkin memerlukan yang lain. Ini terjadi ketika tautan "ld -shared" menyertakan pustaka bersama sebagai salah satu file masukan.

Ketika penaut menemui ketergantungan seperti itu ketika melakukan tautan yang tidak dibagikan, tidak dapat dipindah-pindah, secara otomatis akan mencoba mencari pustaka bersama yang diperlukan dan memasukkannya ke dalam tautan, jika tidak dicantumkan secara eksplisit. Dalam kasus seperti itu, opsi -rpath-link menentukan set pertama direktori untuk mencari. Opsi -rpath-link dapat menentukan urutan nama direktori baik dengan menentukan daftar nama yang dipisahkan oleh titik dua, atau dengan muncul beberapa kali.

Opsi ini harus digunakan dengan hati-hati karena mengesampingkan jalur pencarian yang mungkin sulit dikompilasi menjadi pustaka bersama. Dalam kasus seperti itu adalah mungkin untuk menggunakan jalur pencarian yang berbeda secara tidak sengaja daripada yang dilakukan oleh linker runtime.

Linker menggunakan jalur pencarian berikut untuk mencari pustaka bersama yang dibutuhkan.

1

Semua direktori yang ditentukan oleh opsi -rpath-link .

2

Setiap direktori yang ditentukan oleh opsi -runt . Perbedaan antara -rpath dan -rpath-link adalah direktori yang ditentukan oleh opsi -rpath dimasukkan dalam executable dan digunakan saat runtime, sedangkan opsi -rpath-link hanya efektif pada waktu tautan. Ini hanya untuk tautan asli.

3

Pada sistem ELF, jika opsi -rpath dan "rpath-link" tidak digunakan, cari konten variabel lingkungan "LD_RUN_PATH". Ini hanya untuk tautan asli.

4.

Pada SunOS, jika opsi -rpath tidak digunakan, cari direktori yang ditentukan menggunakan opsi -L .

5.

Untuk penaut asli, isi variabel lingkungan "LD_LIBRARY_PATH".

6

Untuk tautan ELF asli, direktori dalam "DT_RUNPATH" atau "DT_RPATH" dari pustaka bersama dicari untuk pustaka bersama yang dibutuhkan olehnya. Entri "DT_RPATH" diabaikan jika entri "DT_RUNPATH" ada.

7

Direktori default, biasanya / lib dan / usr / lib .

8.

Untuk penaut yang asli pada sistem ELF, jika file /etc/ld.so.conf ada, daftar direktori yang ditemukan di file itu.

Jika pustaka bersama yang diperlukan tidak ditemukan, penaut akan mengeluarkan peringatan dan melanjutkan dengan tautan.

-bersama

-Bagi

Buat pustaka bersama. Saat ini hanya didukung pada platform ELF, XCOFF, dan SunOS. Pada SunOS, tautan akan secara otomatis membuat pustaka bersama jika opsi -e tidak digunakan dan ada simbol yang tidak ditentukan di tautan.

--saham umum

Opsi ini memberi tahu ld untuk mengurutkan simbol umum berdasarkan ukuran ketika menempatkannya di bagian keluaran yang sesuai. Pertama-tama datang semua simbol satu byte, lalu semua dua byte, lalu semua empat byte, dan kemudian yang lainnya. Ini untuk mencegah celah antara simbol karena kendala penjajaran.

--split-oleh-file [ ukuran ]

Mirip dengan --split-by-reloc tetapi membuat bagian output baru untuk setiap file input ketika ukuran tercapai. ukuran default ke ukuran 1 jika tidak diberikan.

--split-by-reloc [ count ]

Mencoba membuat bagian tambahan di file keluaran sehingga tidak ada bagian keluaran tunggal dalam file yang berisi lebih dari hitungan relokasi. Ini berguna ketika menghasilkan file relokasi besar untuk diunduh ke kernel waktu nyata tertentu dengan format file objek COFF; sejak COFFcannot mewakili lebih dari 65535 relokasi dalam satu bagian. Perhatikan bahwa ini akan gagal bekerja dengan format file objek yang tidak mendukung bagian acak. Linker tidak akan membagi bagian input individual untuk redistribusi, jadi jika satu bagian input berisi lebih dari hitungan relokasi satu bagian output akan berisi banyak relokasi. menghitung default ke nilai 32768.

--stats

Hitung dan tampilkan statistik tentang pengoperasian tautan, seperti waktu eksekusi dan penggunaan memori.

--traditional-format

Untuk beberapa target, output dari ld berbeda dalam beberapa hal dari output dari beberapa tautan yang ada. Switch ini meminta ld untuk menggunakan format tradisional sebagai gantinya.

Misalnya, pada SunOS, ld menggabungkan entri duplikat dalam tabel string simbol. Ini dapat mengurangi ukuran file output dengan informasi debug lengkap lebih dari 30 persen. Sayangnya, program SunOS "dbx" tidak dapat membaca program yang dihasilkan ("gdb" tidak memiliki masalah). The -traditional-format switch memberitahu ld untuk tidak menggabungkan entri duplikat.

--section-start sectionname = org

Cari bagian dalam file output di alamat mutlak yang diberikan oleh org . Anda dapat menggunakan opsi ini sebanyak yang diperlukan untuk menemukan beberapa bagian di baris perintah. org harus berupa bilangan bulat heksadesimal tunggal; untuk kompatibilitas dengan penghubung lain, Anda dapat menghilangkan 0x terkemuka yang biasanya terkait dengan nilai heksadesimal. Catatan: seharusnya tidak ada spasi putih di antara sectionname , tanda sama dengan (`` = ''), dan org .

-Tbss org

Org -Tdata

-Ttext org

Gunakan org sebagai alamat awal untuk --- masing-masing --- "bss", "data", atau segmen "teks" dari file output. org harus berupa bilangan bulat heksadesimal tunggal; untuk kompatibilitas dengan penghubung lain, Anda dapat menghilangkan 0x terkemuka yang biasanya terkait dengan nilai heksadesimal.

--dll-verbose

--verbose

Menampilkan nomor versi untuk ld dan mencantumkan emulasi tautan yang didukung. Tampilkan file input mana yang dapat dan tidak dapat dibuka. Tampilkan skrip tautan yang digunakan oleh penaut.

--version-script = versi-scriptfile

Tentukan nama skrip versi ke penaut. Ini biasanya digunakan saat membuat pustaka bersama untuk menentukan informasi tambahan tentang versi heirarki untuk pustaka yang dibuat. Opsi ini hanya berarti pada platform ELF yang mendukung pustaka bersama.

--pering-umum

Peringatkan ketika simbol umum dikombinasikan dengan simbol umum lainnya atau dengan definisi simbol. Tautan Unix memungkinkan praktik yang agak ceroboh ini, tetapi tautan pada beberapa sistem operasi lain tidak. Opsi ini memungkinkan Anda menemukan masalah potensial dari menggabungkan simbol global. Sayangnya, beberapa pustaka C menggunakan praktik ini, jadi Anda mungkin mendapatkan beberapa peringatan tentang simbol di pustaka serta di program Anda.

Ada tiga jenis simbol global, diilustrasikan di sini oleh contoh C:

int i = 1;

Definisi, yang berjalan di bagian data diinisialisasi dari file output.

extern int i;

Referensi tidak terdefinisi, yang tidak mengalokasikan ruang. Harus ada definisi atau simbol umum untuk variabel di suatu tempat.

int i;

Simbol umum. Jika hanya ada (satu atau lebih) simbol umum untuk variabel, ia akan masuk ke area data yang tidak terinisialisasi dari file output. Linker menggabungkan beberapa simbol umum untuk variabel yang sama ke dalam simbol tunggal. Jika ukurannya berbeda, ia memilih ukuran terbesar. Linker mengubah simbol umum menjadi sebuah deklarasi, jika ada definisi dari variabel yang sama.

Opsi - yang umum dipilih dapat menghasilkan lima jenis peringatan. Setiap peringatan terdiri dari sepasang garis: yang pertama menggambarkan simbol yang baru saja ditemui, dan yang kedua menggambarkan simbol sebelumnya yang dijumpai dengan nama yang sama. Satu atau keduanya dari dua simbol akan menjadi simbol umum.

1

Mengubah simbol umum menjadi referensi, karena sudah ada definisi untuk simbol.

(
): peringatan: common ` 'diganti oleh definisi (
): peringatan: didefinisikan di sini

2

Mengubah simbol umum menjadi referensi, karena definisi simbol di kemudian hari ditemukan. Ini sama dengan kasus sebelumnya, kecuali bahwa simbol-simbol itu ditemui dalam urutan yang berbeda.

(
): peringatan: definisi ` 'mengesampingkan umum (
): peringatan: umum ada di sini

3

Menggabungkan simbol umum dengan simbol umum berukuran sama sebelumnya.

(
): peringatan: banyak kesamaan dari ` ' (
): peringatan: sebelumnya umum ada di sini

4.

Menggabungkan simbol umum dengan simbol umum yang lebih besar sebelumnya.

(
): peringatan: common dari ` 'diganti oleh umum lebih besar (
): peringatan: umum lebih besar ada di sini

5.

Menggabungkan simbol umum dengan simbol umum yang lebih kecil sebelumnya. Ini sama dengan kasus sebelumnya, kecuali bahwa simbol-simbol itu ditemui dalam urutan yang berbeda.

(
): peringatan: common dari ` 'mengesampingkan common yang lebih kecil (
): peringatan: lebih kecil umum ada disini

--pencari-konstruktor

Peringatkan jika ada konstruktor global yang digunakan. Ini hanya berguna untuk beberapa format file objek. Untuk format seperti COFF atau ELF, penghubung tidak dapat mendeteksi penggunaan konstruktor global.

--swarn-multiple-gp

Peringatkan jika beberapa nilai penunjuk global diperlukan dalam file keluaran . Ini hanya bermakna untuk prosesor tertentu, seperti Alpha. Secara khusus, beberapa prosesor menempatkan konstanta bernilai tinggi di bagian khusus. Sebuah register khusus (pointer global) menunjuk ke tengah bagian ini, sehingga konstanta dapat dimuat secara efisien melalui mode pengalamatan daftar basis-register. Karena offset dalam mode relatif register-dasar adalah tetap dan relatif kecil (misalnya, 16 bit), ini membatasi ukuran maksimum dari kolam konstan. Dengan demikian, dalam program besar, seringkali perlu menggunakan beberapa nilai penunjuk global untuk dapat mengatasi semua kemungkinan konstanta. Opsi ini menyebabkan peringatan dikeluarkan setiap kali kasus ini terjadi.

- ingat sekali

Hanya memperingatkan satu kali untuk setiap simbol yang tidak terdefinisi, daripada sekali per modul yang merujuk padanya.

--warn-section-align

Peringatkan jika alamat bagian output diubah karena keselarasan. Biasanya, penjajaran akan diatur oleh bagian input. Alamat hanya akan diubah jika tidak secara eksplisit ditentukan; yaitu, jika perintah "SECTIONS" tidak menentukan alamat awal untuk bagian tersebut.

- keseluruhan arsip

Untuk setiap arsip yang disebutkan pada baris perintah setelah opsi --seluruh-arsip , sertakan setiap file objek dalam arsip di tautan, daripada mencari arsip untuk file objek yang diperlukan. Ini biasanya digunakan untuk mengubah file arsip menjadi pustaka bersama, yang memaksa setiap objek dimasukkan dalam pustaka bersama yang dihasilkan. Opsi ini dapat digunakan lebih dari satu kali.

Dua catatan ketika menggunakan opsi ini dari gcc: Pertama, gcc tidak tahu tentang opsi ini, jadi Anda harus menggunakan -Wl, -pengarsipan-utuh . Kedua, jangan lupa untuk menggunakan -Wl, -tidak-keseluruhan-arsip setelah daftar arsip Anda, karena gcc akan menambahkan daftar arsipnya sendiri ke tautan Anda dan Anda mungkin tidak ingin bendera ini memengaruhi mereka juga.

--Simbol bungkus

Gunakan fungsi wrapper untuk simbol . Setiap referensi simbol yang tidak didefinisikan akan diatasi menjadi "__ wrap_symbol". Referensi apa pun yang tidak didefinisikan untuk "__real_symbol" akan dipecahkan menjadi simbol .

Ini dapat digunakan untuk menyediakan pembungkus untuk fungsi sistem. Fungsi bungkus harus disebut "__wrap_symbol". Jika ingin memanggil fungsi sistem, ia harus memanggil "__ real_symbol".

Berikut adalah contoh sepele:

void * __wrap_malloc (int c) {printf ("malloc dipanggil dengan% ld \ n", c); kembalikan __real_malloc (c); }

Jika Anda menautkan kode lain dengan file ini menggunakan --wrap malloc , maka semua panggilan ke "malloc" akan memanggil fungsi "__wrap_malloc" sebagai gantinya. Panggilan ke "__real_malloc" di "__wrap_malloc" akan memanggil fungsi "malloc" yang sesungguhnya.

Anda mungkin ingin menyediakan fungsi "__real_malloc" juga, sehingga tautan tanpa opsi --wrap akan berhasil. Jika Anda melakukan ini, Anda tidak harus meletakkan definisi "__ real_malloc" dalam file yang sama dengan "__wrap_malloc"; jika Anda melakukannya, assembler dapat menyelesaikan panggilan sebelum linker memiliki kesempatan untuk membungkusnya ke "malloc".

--enable-new-dtags

--disable-new-dtags

Tautan ini dapat membuat tag dinamis baru di ELF. Tetapi sistem ELF yang lebih tua mungkin tidak memahaminya. Jika Anda menentukan --enable-new-dtags , tag dinamis akan dibuat sesuai kebutuhan. Jika Anda menentukan --disable-new-dtags , tidak ada tag dinamis baru yang akan dibuat. Secara default, tag dinamis baru tidak dibuat. Perhatikan bahwa opsi tersebut hanya tersedia untuk sistem FORCE.

Linker i386 PE mendukung opsi-bersama, yang menyebabkan output menjadi sebuah perpustakaan yang terhubung secara dinamis (DLL) daripada dieksekusi normal. Anda harus memberi nama output "* .dll" saat Anda menggunakan opsi ini. Selain itu, linker sepenuhnya mendukung file "* .def" standar, yang dapat ditentukan pada baris perintah linker seperti file objek (sebenarnya, harus mendahului arsip yang mengekspor simbol dari, untuk memastikan bahwa mereka dapat terhubung, sama seperti file objek normal).

Selain opsi yang umum untuk semua target, linker i386 PE mendukung opsi baris perintah tambahan yang khusus untuk target PE i386. Opsi yang mengambil nilai dapat dipisahkan dari nilainya dengan spasi atau tanda sama dengan.

--add-stdcall-alias

Jika diberikan, simbol dengan akhiran stdcall (@ nn ) akan diekspor apa adanya dan juga dengan akhiran dilucuti.

- file basis file

Gunakan file sebagai nama file untuk menyimpan alamat dasar dari semua relokasi yang diperlukan untuk menghasilkan DLL dengan dlltool .

--dll

Buat DLL alih-alih eksekusi reguler. Anda juga dapat menggunakan -membagikan atau menentukan "PERPUSTAKAAN" dalam file ".def" yang diberikan.

--enable-stdcall-fixup

--disable-stdcall-fixup

Jika tautan menemukan simbol yang tidak dapat diselesaikan, tautan akan berusaha melakukan `` menghubungkan fuzzy '' dengan mencari simbol lain yang didefinisikan yang hanya berbeda dalam format nama simbol (cdecl vs stdcall) dan akan menyelesaikan simbol tersebut dengan menautkan untuk pertandingan. Misalnya, simbol undefined "_foo" mungkin terkait dengan fungsi "_foo @ 12", atau simbol tak terdefinisi "_bar @ 16" mungkin terkait dengan fungsi "_bar". Ketika linker melakukan ini, itu mencetak peringatan, karena biasanya seharusnya gagal untuk menghubungkan, tetapi kadang-kadang mengimpor perpustakaan yang dihasilkan dari dll pihak ketiga mungkin perlu fitur ini dapat digunakan. Jika Anda menentukan --enable-stdcall-fixup , fitur ini sepenuhnya diaktifkan dan peringatan tidak dicetak. Jika Anda menentukan --menonaktifkan-stdcall-fixup , fitur ini dinonaktifkan dan ketidakcocokan tersebut dianggap sebagai kesalahan.

--ekspor-semua-simbol

Jika diberikan, semua simbol global dalam objek yang digunakan untuk membangun DLL akan diekspor oleh DLL. Perhatikan bahwa ini adalah default jika tidak akan ada simbol yang diekspor. Ketika simbol secara eksplisit diekspor melalui file DEF atau secara implisit diekspor melalui atribut fungsi, defaultnya adalah tidak mengekspor apa pun kecuali opsi ini diberikan. Perhatikan bahwa simbol "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12", dan "impure_ptr" tidak akan diekspor secara otomatis. Juga, simbol yang diimpor dari DLL lain tidak akan diekspor kembali, begitu pula simbol yang menentukan tata letak internal DLL seperti yang diawali dengan "_head_" atau diakhiri dengan "_iname". Selain itu, tidak ada simbol dari "libgcc", "libstd ++", "libmingw32", atau "crtX.o" akan diekspor. Simbol yang namanya dimulai dengan "__rtti_" atau "__builtin_" tidak akan diekspor, untuk membantu dengan C ++ DLL. Akhirnya, ada daftar panjang simbol cygwin-private yang tidak diekspor (jelas, ini berlaku ketika membangun DLL untuk target cygwin).

Ini cygwin-tidak termasuk: "_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 ", dan" environ ".

--sertakan simbol simbol , simbol , ...

Menentukan daftar simbol yang seharusnya tidak diekspor secara otomatis. Nama simbol dapat dibatasi oleh koma atau titik dua.

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

Menentukan daftar pustaka arsip dari simbol mana yang seharusnya tidak diekspor secara otomatis. Nama-nama perpustakaan dapat dibatasi oleh koma atau titik dua. Menentukan "--exclude-libs ALL" mengecualikan simbol di semua pustaka arsip dari ekspor otomatis. Simbol yang secara eksplisit tercantum dalam file .def masih diekspor, terlepas dari opsi ini.

--file-alignment

Tentukan perataan file. Bagian dalam file akan selalu dimulai pada file offset yang merupakan kelipatan dari nomor ini. Ini secara default ke 512.

--tadangan cadangan

--tadangan cadangan , komit

Tentukan jumlah memori untuk cadangan (dan opsional) untuk digunakan sebagai tumpukan untuk program ini. Standarnya adalah 1Mb cadangan, 4K berkomitmen.

- nilai dasar-dasar

Gunakan nilai sebagai alamat dasar program Anda atau dll. Ini adalah lokasi memori terendah yang akan digunakan ketika program Anda atau dll dimuat. Untuk mengurangi kebutuhan untuk relokasi dan meningkatkan kinerja dll Anda, masing-masing harus memiliki alamat dasar yang unik dan tidak tumpang tindih dengan dll lainnya. Standarnya adalah 0x400000 untuk executable, dan 0x10000000 untuk dll.

--kill-at

Jika diberikan, stdcall suffix ( @nn ) akan dilepaskan dari simbol sebelum diekspor.

- nilai -major-gambar-versi

Menyetel nomor utama dari `` versi gambar ''. Default 1.

- nilai versi major-os-version

Menyetel nomor utama dari `` os version ''. Default ke 4.

- nilai versi mocor-subsistem

Menetapkan nomor utama dari `` subsistem versi ''. Default ke 4.

- nilai minimum-gambar-versi

Setel nomor kecil dari `` versi gambar ''. Default ke 0.

- nilai min-os-versi

Setel angka minor dari `` os version ''. Default ke 0.

--minor-subsistem- nilai versi

Setel angka minor dari `` versi subsistem ''. Default ke 0.

- file output-def

Linker akan membuat file file yang akan berisi file DEF yang sesuai dengan DLL yang dihasilkan linker. File DEF ini (yang seharusnya disebut "* .def") dapat digunakan untuk membuat pustaka impor dengan "dlltool" atau dapat digunakan sebagai referensi untuk simbol yang diekspor secara otomatis atau implisit.

file -out-implib

Linker akan membuat file file yang akan berisi lib impor yang terkait dengan DLL yang dihasilkan oleh linker. Import lib ini (yang seharusnya disebut "* .dll.a" atau "* .a" dapat digunakan untuk menghubungkan klien dengan DLL yang dihasilkan; perilaku ini memungkinkan untuk melewati langkah pembuatan pustaka impor "dlltool" terpisah.

--enable-auto-image-base

Secara otomatis memilih basis gambar untuk DLL, kecuali jika ditentukan menggunakan argumen "--image-base". Dengan menggunakan hash yang dihasilkan dari nama dll untuk membuat basis gambar unik untuk setiap DLL, tabrakan dan relokasi dalam memori yang dapat menunda eksekusi program dihindari.

--disable-auto-image-base

Jangan secara otomatis menghasilkan basis gambar yang unik. Jika tidak ada basis gambar yang ditentukan pengguna ("--gambar dasar"), maka gunakan default platform.

--dll- string pencarian-awalan

Ketika menautkan secara dinamis ke dll tanpa pustaka impor, cari " .dll" dalam preferensi ke "lib .dll". Perilaku ini memungkinkan pembedaan mudah antara DLL yang dibuat untuk berbagai "subplatform": asli, cygwin, uwin, pw, dll. Misalnya, cygwin DLL biasanya menggunakan "--dll-search-prefix = cyg".

--enable-auto-import

Lakukan penghubungan canggih "_symbol" ke "__imp__symbol" untuk impor DATA dari DLL, dan buat simbol yang diperlukan saat membangun pustaka impor dengan DATAexports tersebut. Ini umumnya akan 'hanya berfungsi' - tetapi terkadang Anda mungkin melihat pesan ini:

"variabel '' tidak dapat diimpor secara otomatis. Harap baca dokumentasi untuk" --enable-auto-import "ld untuk detail."

Pesan ini terjadi ketika beberapa (sub) ekspresi mengakses alamat yang diberikan oleh jumlah dari dua konstanta (tabel impor Win32 hanya mengizinkan satu). Contoh di mana ini dapat terjadi termasuk akses ke bidang anggota variabel struct yang diimpor dari DLL, serta menggunakan indeks konstan ke dalam variabel array yang diimpor dari DLL. Setiap variabel multi-kata (array, struct, panjang panjang, dll) dapat memicu kondisi kesalahan ini. Namun, terlepas dari jenis data yang tepat dari variabel diekspor yang melanggar, ld akan selalu mendeteksinya, mengeluarkan peringatan, dan keluar.

Ada beberapa cara untuk mengatasi kesulitan ini, terlepas dari tipe data dari variabel yang diekspor:

Salah satu caranya adalah dengan menggunakan switch -enable-runtime-pseudo-reloc. Ini menyisakan tugas menyesuaikan referensi dalam kode klien Anda untuk lingkungan waktu proses, sehingga metode ini hanya berfungsi ketika lingkungan runtime mendukung fitur ini.

Solusi kedua adalah memaksa salah satu dari 'konstanta' menjadi variabel --- yaitu, tidak diketahui dan tidak dapat dioptimalkan pada waktu kompilasi. Untuk array, ada dua kemungkinan: a) membuat indexee (alamat array) suatu variabel, atau b) membuat 'constant' index suatu variabel. Demikian:

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

atau

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

Untuk struct (dan sebagian besar tipe data multi-kata) satu-satunya pilihan adalah untuk membuat struct itu sendiri (atau panjang, atau ...) variabel:

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

atau

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

Metode ketiga untuk mengatasi kesulitan ini adalah dengan meninggalkan 'auto-import' untuk simbol yang menyinggung dan menandainya dengan "__declspec (dllimport)". Namun, dalam prakteknya yang membutuhkan menggunakan waktu-kompilasi # mendefinisikan untuk menunjukkan apakah Anda sedang membangun DLL, membangun kode klien yang akan menghubungkan ke DLL, atau hanya membangun / menghubungkan ke perpustakaan statis. Dalam membuat pilihan antara berbagai metode untuk menyelesaikan masalah 'alamat langsung dengan masalah offset konstan', Anda harus mempertimbangkan penggunaan nyata di dunia nyata:

Asli:

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

Solusi 1:

--foo.h extern int arr []; --foo.c #include "foo.h" void main (int argc, char ** argv) {/ * Solusi ini untuk win32 dan cygwin; jangan "mengoptimalkan" * / volatile int * parr = arr; printf ("% d \ n", parr [1]); }

Solusi 2:

--foo.h / * Catatan: ekspor-otomatis diasumsikan (tidak ada __declspec (dllexport)) * / #if (didefinisikan (_WIN32) || didefinisikan (__ CYGWIN__)) && \! (didefinisikan (FOO_BUILD_DLL) || didefinisikan (FOO_STATIC )) #define FOO_IMPORT __declspec (dllimport) #else #define FOO_IMPORT #endif ekstern FOO_IMPORT int arr []; --foo.c #include "foo.h" void main (int argc, char ** argv) {printf ("% d \ n", arr [1]); }

Cara keempat untuk menghindari masalah ini adalah dengan mengkodekan ulang pustaka Anda untuk menggunakan antarmuka fungsional daripada antarmuka data untuk variabel yang menyinggung (misalnya fungsi set_foo () dan get_foo () accessor).

--disable-auto-import

Jangan mencoba untuk menghubungkan tautan "_symbol" ke "__imp__symbol" untuk DATAimports dari DLL.

--enable-runtime-pseudo-reloc

Jika kode Anda mengandung ekspresi yang dijelaskan di dalam --enable-auto-import section, yaitu, DATAdiport dari DLL dengan non-zero offset, switch ini akan membuat vektor 'relokasi pseudo runtime' yang dapat digunakan oleh lingkungan runtime untuk menyesuaikan referensi ke data tersebut dalam kode klien Anda.

--menonaktifkan-runtime-pseudo-reloc

Jangan membuat relokasi palsu untuk impor DATA non-nol offset dari DLL. Ini adalah default.

--enable-ekstra-pe-debug

Tampilkan info debug tambahan yang terkait dengan pencitraan simbol impor otomatis.

--section-alignment

Setel perataan bagian. Bagian dalam memori akan selalu dimulai pada alamat yang merupakan kelipatan dari angka ini. Default ke 0x1000.

- cadangan cadangan

- cadangan cadangan , komit

Tentukan jumlah memori untuk cadangan (dan opsional) untuk digunakan sebagai stack untuk program ini. Standarnya adalah 2Mb cadangan, 4K berkomitmen.

--subsystem yang mana

--subsystem yang : utama

--subsystem yang : utama . minor

Menentukan subsistem di mana program Anda akan dieksekusi. Nilai-nilai hukum yang "asli", "windows", "konsol", dan "posix". Anda dapat secara opsional mengatur versi subsistem juga.

Penting: Gunakan perintah man ( % man ) untuk melihat bagaimana perintah digunakan pada komputer khusus Anda.