嵌入式Linux中使用動態和靜態編譯的有趣現象

      以前在Freescale 的i.MX和三星的2410板子上開發Linux的時候,內存容量都是32M,甚至128M的SDRAM,想怎麼用就怎麼用。在移植Busybox也是採取的動態鏈接的方式進行編譯。

      可是今天遇到問題了,而57的EVB的內存只有8MB,而且我的內核還不是XIP運行的,加上爲了調試內核方便,採用的是O1的編譯選項,大概有2.4M內核。

      編譯的busybox是224K,通過readelf知道其依賴動態庫位libc.so.6, 爲了減小文件系統大小,只拷貝要用的庫,再也不能像開發2410那樣把有用沒有的都拷上了。把libc.so.6符號鏈接及其文件libc-2.3.5.so一起放在文件系統中,通過cramfs做出的大小大概爲700K。

      燒至Flash中,發現在Mount RAMDISK後提示運行“Failed to execute /sbin/init.  Attempting defaults...”. 要是在以前,肯定又是無從下手,到處google了,或者把庫一個一個拷進去試。現在有了RVDS,直接調試內核,發現是load_elf_binary的時候運行interpreter失敗:

   interpreter = open_exec(elf_interpreter);
   retval = PTR_ERR(interpreter);
   if (IS_ERR(interpreter))
    goto out_free_interp;
   其中使用的interpreter爲ld-linux-so.2. 將該文件拷貝至lib目錄下,系統就正常boot起來了。但是又有了一個新問題。由於busybox中的每一個applet都是通過符號鏈接指向busybox本身,因此運行applet就相當於運行一個busybox,佔用的內存就是busybox的大小加上動態庫libc-2.3.5.so的大小,大概是1.8M,這樣,我的內存又喫緊了:

 

 

而如果直接使用靜態編譯的話,busybox的大小約爲1M,這樣啓動以後的內存佔用將大爲減小,而且使用cramfs的文件系統只有不到500K。

 

同時通過查看/proc/meminfo,在使用動態編譯的時候只有大概500K的MemFree,而在使用靜態編譯的時候有大概1.4M的MemFree。開來動靜態編譯的選擇標準也不是一成不變的,除了調試的時候使用靜態編譯以外,像這種內存少的系統也可以使用靜態編譯來節省內存開銷。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章