天天看點

淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位

淺淡代碼如何從源檔案轉變成可執行檔案

  • 程式的翻譯環境和執行環境
  • 詳解編譯+連結
  • 符号彙總
  • 符号表
  • 合并連結清單以及符号表合并和重定位

程式的翻譯環境和執行環境

淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位

詳解編譯+連結

淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位
淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位

符号彙總

//**test.c裡面的代碼**

int a = 2022;


int Add(int x, int y);

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}


	return 0;
}
           
//add.c裡面的代碼
int Add(int x, int y)
{
	return x + y;
}
           
這裡有一段代碼,我們所說的符号彙總,指的是全局變量,請看下圖
淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位

符号表

淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位

合并連結清單以及符号表合并和重定位

合并連結清單的意思是,假設有兩塊連結清單把相同的内容合并起來
淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位
淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位

為什麼Add使用0X100的位址呢?

是因為test.c中的Add隻是聲明而已,他的位址并沒有實際意思,隻是告訴有這個函數,而add.c中的Add中的位址是定義,告訴編譯器這個函數位置哪裡

>這也是垂定位的作用,是非常重要的

如果沒有垂定位,直接把這三個放在一起
淺淡代碼如何從源檔案轉變成可執行檔案程式的翻譯環境和執行環境詳解編譯+連結符号彙總符号表合并連結清單以及符号表合并和重定位
是非常危險的

因為在連結的時候,根本找不到Add這個函數在哪裡。會報連結錯誤!

繼續閱讀