Openswan Porting to Pronghorn-Metro 實務經驗分享 04
上次處理到 Openswan 的編譯,最後停在了 endian 的問題,這次能不能順利解決呢?
在使用 GCC 的編譯上,預設為 little-endian,如果要特別編譯成 big-endian 的話,要加上一個 -mbig-endian 的參數,所以,我們再來一遍。
編譯 GMP
./configure --host=arm-linux CC="arm-linux-gcc" CXX="ucfront-g++ arm-linux-uclibc-g++" --prefix=/usr/local/arm-linux CFLAGS=-mbig-endian
make
make install
然後,在 openswan/Makefile.inc 加上 CFLAGS += -mbig-endian
編譯 Openswan
make KERNELSRC=../../ADI/linux-2.6.x ARCH=arm OSDEP=linux USE_NETKEY=yes CC="arm-linux-gcc -L../ADI/romfs/lib" LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar AS=arm-linux-as STRIP=arm-linux-strip programs
make DESTDIR=../../ADI/romfs install
過了嗎??沒有!!怎麼可能... 我發現在 make 的時候,回報的信息告訴我說要編譯 little-endian 的執行檔卻使用 big-endian 的 library。How could it be?? 我不是連 CFLAGS 都設定好了嗎? 正當一籌莫展的時候,幸好辦公室的同事(Hidding)即時出手相救。他很有耐心的去觀看編譯的過程,發現在編譯那幾隻程式的時候根本沒有吃到 -mbig-endian!於是我在打開 Makefile (openswan/program/pluto/Makefile) 來看 ... 天啊... 在編譯的時候根本沒有使用 CFLAGS 嘛(你前面的 CFLAGS 是寫好玩得就是了)
罪魁禍首是下面幾個~
alg_info_test:
$(BINNAMEPLUTO):
$(BINNAMEADNS):
$(BINNAMEWHACK):
$(BINNAMEWHACKINIT):
加上 CFLAGS 就可以編譯成功了。
在放到版子上執行,就會動了...才怪。他告訴我說缺少 libgmp.a ... 恩,忘了放上去。放上之後在執行一次... 他又告訴我缺少 libc.so.6 ... 奇怪,這種東西怎麼可能會少呢?這不是標準的 Glibc 嗎 ... ? 正當我這麼想的時候...我發現我錯得很離譜 ... 之前在編譯系統的時候,我明明給人家選 uClibc 的... sigh,這樣 libgmp 跟 openswan 都要重編了...。為了節省時間(或著是說建立已經被摧毀的一乾二淨的成就感),這次我不再自己編 libgmp 了,而是直接使用 ADI 所提供的 libgmp ( 在 Customize Vendor/User Settings 裡面打勾就好了 ),然後在對 OpenSwan 進行編譯的動作。
正在想要如何讓 Openswan 使用 uClibc 而不是 glibc 的時候(實在很不想用 buildroot),這時候,Hidding 又跳出來了,「你可以直接使用 ADI 所提供的 ucfront-gcc」,太好了,那就這樣幹吧~最後,我的 make 變成了下面這個樣子
make KERNELSRC=../../ADI/linux-2.6.x ARCH=arm OSDEP=linux USE_NETKEY=yes CC="../../ADI/tools/ucfront-gcc arm-linux-gcc -L../../ADI/romfs/lib" LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar AS=arm-linux-as STRIP=arm-linux-strip programs
make DESTDIR=../../ADI/romfs install
Anyway ... 總算完工了... 之後,手動進行 strip ...那...到底能不能再版子上順利完成 IPsec Tunnel 的建立呢?下回在說吧
Porting 的紀錄又翻過了一頁~
在使用 GCC 的編譯上,預設為 little-endian,如果要特別編譯成 big-endian 的話,要加上一個 -mbig-endian 的參數,所以,我們再來一遍。
編譯 GMP
./configure --host=arm-linux CC="arm-linux-gcc" CXX="ucfront-g++ arm-linux-uclibc-g++" --prefix=/usr/local/arm-linux CFLAGS=-mbig-endian
make
make install
然後,在 openswan/Makefile.inc 加上 CFLAGS += -mbig-endian
編譯 Openswan
make KERNELSRC=../../ADI/linux-2.6.x ARCH=arm OSDEP=linux USE_NETKEY=yes CC="arm-linux-gcc -L../ADI/romfs/lib" LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar AS=arm-linux-as STRIP=arm-linux-strip programs
make DESTDIR=../../ADI/romfs install
過了嗎??沒有!!怎麼可能... 我發現在 make 的時候,回報的信息告訴我說要編譯 little-endian 的執行檔卻使用 big-endian 的 library。How could it be?? 我不是連 CFLAGS 都設定好了嗎? 正當一籌莫展的時候,幸好辦公室的同事(Hidding)即時出手相救。他很有耐心的去觀看編譯的過程,發現在編譯那幾隻程式的時候根本沒有吃到 -mbig-endian!於是我在打開 Makefile (openswan/program/pluto/Makefile) 來看 ... 天啊... 在編譯的時候根本沒有使用 CFLAGS 嘛(你前面的 CFLAGS 是寫好玩得就是了)
罪魁禍首是下面幾個~
alg_info_test:
$(BINNAMEPLUTO):
$(BINNAMEADNS):
$(BINNAMEWHACK):
$(BINNAMEWHACKINIT):
加上 CFLAGS 就可以編譯成功了。
在放到版子上執行,就會動了...才怪。他告訴我說缺少 libgmp.a ... 恩,忘了放上去。放上之後在執行一次... 他又告訴我缺少 libc.so.6 ... 奇怪,這種東西怎麼可能會少呢?這不是標準的 Glibc 嗎 ... ? 正當我這麼想的時候...我發現我錯得很離譜 ... 之前在編譯系統的時候,我明明給人家選 uClibc 的... sigh,這樣 libgmp 跟 openswan 都要重編了...。為了節省時間(或著是說建立已經被摧毀的一乾二淨的成就感),這次我不再自己編 libgmp 了,而是直接使用 ADI 所提供的 libgmp ( 在 Customize Vendor/User Settings 裡面打勾就好了 ),然後在對 OpenSwan 進行編譯的動作。
正在想要如何讓 Openswan 使用 uClibc 而不是 glibc 的時候(實在很不想用 buildroot),這時候,Hidding 又跳出來了,「你可以直接使用 ADI 所提供的 ucfront-gcc」,太好了,那就這樣幹吧~最後,我的 make 變成了下面這個樣子
make KERNELSRC=../../ADI/linux-2.6.x ARCH=arm OSDEP=linux USE_NETKEY=yes CC="../../ADI/tools/ucfront-gcc arm-linux-gcc -L../../ADI/romfs/lib" LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar AS=arm-linux-as STRIP=arm-linux-strip programs
make DESTDIR=../../ADI/romfs install
Anyway ... 總算完工了... 之後,手動進行 strip ...那...到底能不能再版子上順利完成 IPsec Tunnel 的建立呢?下回在說吧
Porting 的紀錄又翻過了一頁~
不好意思 我不太會用這個
回覆刪除應該是04這邊 方便的話 有幾個問題想請教您
我的mail是qq11010817@gmail.com
回覆刪除