Linker Scripts2 鏈結器選項概述

2022-05-06 09:42:08 字數 1505 閱讀 9194

為了盡可能的與其它鏈結器相容,gnu鏈結器ld涵蓋了很多情況。因此,有很多選項可以控制鏈結器的行為。

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

如上告知ld生成output輸出檔案,它是由/lib/crt0.o hello.c和庫libc.a鏈結而成。libc.a會從一些標準的搜尋目錄中找到(可以參見下面關於』l』的選項)

ld命令列選項可以出現在命令列的任何地方。儘管如此,與目標檔案和其它檔案選項相比,引用檔案的選項如」l」和」t」,在出現的地方會引起檔案被讀取。

重複不同的引數的non-file選項不會產生進一步的影響,或許會覆蓋前面的效果(出現在命令列左側的引數)。

多餘乙個的選項可能是更有意義的,將會在下面進行描述。

non-option引數是物件檔案或被鏈結在一起的檔案。他們或者跟在命令列選項後面或者位於命令列選項前面或者與命令列選項混雜在一起,除非物件檔案引數可能不會放到選項和引數之間。

通常鏈結器在至少有乙個物件檔案時才被呼叫,但是你可以使用」-l」 「-r」或指令碼命令語言指定其他形式的二進位制輸入檔案,如果沒有指定任何二進位制輸入檔案,鏈結器不會產生任何輸出,會產生訊息:「no input files」。

如果鏈結器不能識別物件檔案的格式,它會假定它是乙個鏈結指令碼。用這種方式指定的指令碼會擴充鏈結器使用的主鏈結指令碼(預設的鏈結指令碼或-t指定的指令碼)。

這個特性使得鏈結器會去鏈結一些檔案,這些檔案看上去像是object或archive,而實際上僅僅包含幾個符號定義或使用input或group來去load其它objects.

用這種方式指定乙個指令碼僅僅是擴充了主鏈結指令碼,而用"-t"選項是替換整個鏈結指令碼,但是要主要對"insert"命令的影響法(chapter 3 [scripts], page 37.)

對於名字是單個字母的選項,選項引數必須跟在選項字母後面,不需要空格,或者作為一些分開的引數跟在選項後面。

對於有多個字母的選項,字母前面可以由一條或者兩條的**,比如:『-trace-symbol』 and 『--trace-symbol』是等價的。

注;由乙個例外是如果以o開頭的多個字母選項,前面必須有兩條**,這是為了避免與-o選項混淆,比如:『-omagic』設定輸出檔名為 『magic』 而『--omagic』輸出時設定 nmagic標記

對於多字母選項必須用"="將選項名分開,或者作為引數直接跟在選項名後面,如:『--trace-symbol foo』 and 『--trace-symbol=foo』是等價的。多字母選項的唯一縮寫也是可以的

gcc -wl,--start-group foo.o bar.o -wl,--end-group

這是很重要的,否則編譯器驅動會悄悄的刪除掉這些鏈結器選項,造成鏈結錯誤。

當通過編譯器驅動傳遞的選項需要值的時候,可能引起混亂,因為選項和引數之間的空格扮演乙個分隔符,這樣編譯器驅動只會傳遞選項給鏈結器,引數傳遞給編譯器,

這種情況下最簡單的處理方法是像下面這樣:(單字母選項直接後跟引數,多字母選項用=連線)

gcc foo.o bar.o -wl,-eentry -wl,-map=a.map

區塊鏈 基礎2

區塊鏈到底是如何工作?區塊鏈涵蓋了哪些關鍵技術?使其被稱為 信任機器 要搞懂區塊鏈交易工作原理與流程,可先將其分成交易與區塊兩個部分,來了解區塊鏈交易的原理流程。下面是區塊鏈交易的五個流程 第一步 交易的生成 當前所有者利用私鑰對前一次交易和下一位所有者簽署乙個數字簽名,並將這個簽名附加在這枚貨幣的...

2個鏈棧實現鏈隊功能

2chainstack chainqueue.cpp 定義控制台應用程式的入口點。兩個鏈棧實現乙個鏈隊功能 include stdafx.h include typedef int type using namespace std 鏈棧結點 typedef struct stack stack,ps...

區塊鏈 學習報告 2

本人學習報告,僅為複習用 參考學習資料 奇客谷 智慧型合約教程 以太坊 ethereum被稱為區塊鏈2.0,位元幣可以被認為是一種數字貨幣,而以太坊除了是數字貨幣,還有提供了對數字貨幣進行程式設計的能力,即智慧型合約。以太坊 ethereum 是乙個可程式設計的虛擬幣,它是乙個基於公共區塊鏈的分布式...