<optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

<code id="6y7f6"></code>

  • <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
    <code id="6y7f6"><form id="6y7f6"></form></code>

      Linux環境下:程序的鏈接, 裝載和庫[靜態鏈接]

      看以下例子
      main.c

      extern int x;
      
      int main()
      {
          int y = 100;
          swap(&x,&y);
          return 0;
      }
      
      int x = 1;
      
      void swap(int* x, int* y)
      {
          int temp = *x;
          *x = *y;
          *y = temp;
      }
      

      段的合并

      main.o
      image.png
      swap.o
      image.png

      鏈接生成靜態庫: ld main.o swap.o -e main -o stlink 將多個目標鏈接生成可執行文件,默認好像是靜態鏈接
      image.png

      可以看到生成的stlink的.text .data的大小是原先兩個文件之和。2c + 2c = 58

      重定位

      main.o 反匯編 objdump -d -s main.o
      image.png
      swap.o
      image.png
      通過 objdump -r main.o查看目標文件中有哪些是需要重定位的符號
      image.png
      可以看到main.o中的.text 段有兩個符號需要重定位,一個是參數x,一個swap函數,OFFSET分別是17和21。從相應的從main.o 反匯編中可以看到這兩個offset處的地址都是 00 00 00 00 是因為在生成main.o的時候還無法確認這些符號的位置(中間b8也是00.. 是為啥?)。
      通過readelf -s main.o也可以得到相同的結果(圖中的x和swap是UNDEFINED的)
      image.png
      重定位后 objdump -d -s stlink
      image.png
      可以上面需要relocate的位置已經被替換了 參數x 替換成了 600198 這個對應合并后 .data段的絕對地址。
      函數swap則是使用的相對尋址 絕對地址是400114,相對地址=下一定要執行的地址和真實swap地址的偏移(400114-40010d=7)
      image.png

      posted @ 2023-02-04 22:19  Aitozi  閱讀(135)  評論(0編輯  收藏  舉報
      欧洲黄色网页链接入口,免费A级毛片无码无遮挡久久影院,a免费黄色网址,国产一级黄色的网站
      <optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

      <code id="6y7f6"></code>

    1. <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
      <code id="6y7f6"><form id="6y7f6"></form></code>