天天看點

在cygwin 2.510.2.2上成功編譯安裝skyeye-1.2.5

因為想用eclipse學習skyeye代碼,而我的本本太慢了,無法想象在VMWare跑eclipse會是什麼樣子。

是以決定重新在cygwin上裝一個skyeye.

環境:

OS: XP SP3

skyeye: 1.2.5

cygwin: 2.510.2.2

gcc:3.4.4

1)編譯

./configure

./make

但是編譯到下面這一行時編譯就出錯了."storage size of 'tv' isn't known"

arch\ppc\common\ppc_arch_interface.c:139

          struct timeval tv;

在ppc_arch_interface.c加上一行頭檔案定義,就OK了。

#include

2)測試

下面做個簡單的測試,進入skyeye-testsuite的下面的目錄

cd C:\Downloads\skyeye-testsuite-1.2.5\linux\s3c2410\s3c2410x-2.6.14

skyeye.exe -e vmlinux

arch: arm

cpu info: armv4, arm920t, 41009200, ff00fff0, 2

mach info: name s3c2410x, mach_init addr 0x423dc0

[TAP-WIN32]: Error enumerating registry subkeys of key: SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}

[TAP-WIN32]: ERROR: SkyEye requires a TAP-Win32 driver that is at least version 7.1

Please install from http://prdownloads.sourceforge.net/openvpn/openvpn-2.0_beta2-install.exe

failed to setup_module (name:net, type:cs8900a)

SKYEYE: use arm920t mmu ops

**************************** WARNING **********************************

If you want to run ELF image, you should use -e option to indicate

your elf-format image filename. Or you only want to run binary image,

you need to set the filename of the image and its entry in skyeye.conf.

***********************************************************************

Non-option argument -e

Non-option argument vmlinux

Your elf file is little endian.

uart_mod:0, desc_in:, desc_out:, converter:

Loaded RAM   ./initrd.img

SKYEYE:Error in mem_read_word, no bank found, NumInstrs 6291454, mem_read_word addr = 0 no bank

SKYEYE:Error in mem_read_word, no bank found, NumInstrs 6291454, mem_read_word addr = 4 no bank

SKYEYE:Error in mem_read_word, no bank found, NumInstrs 6291454, mem_read_word addr = 8 no bank

出錯了!不要緊,看來是缺少網絡驅動tuntap,先将其去掉,在配置檔案skyeye.conf中将下面一行注掉.

#net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1

現在再來一遍.前面[TAP-WIN32]的錯誤沒有了,但後面的錯誤還在.原因應該是沒有加載vmlinux.

從現象是和源代碼分析,應該是getopt()解析參數有問題。為什麼會出問題,開始我懷疑是因為沒有定義__CYGWIN__宏。從下面的代碼看,cygwin上引用的頭檔案是不一樣的。

skyeye.c:

#ifdef __CYGWIN__

#else

#endif

于是我在所有Makefile檔案中的DEF宏裡都加上-D__CYGWIN__.然後重新編譯.結果還是老樣子.于是繼續找原因.費了很大的力氣,最後終于搞清楚了.

getopt()函數使用的一個全局變量optarg和libiberty.a庫中的一個變量重名。導緻getopt()函數執行後optarg沒有被正确指派。

知道原因了,解決起來也很容易。連接配接生成skyeye.exe時把libc.a和libiberty.a的順序調一下,讓libc.a放到前面就OK了。具體就是修改一下skyeye根目錄下的Makefile檔案.

修改前:

LIBS = -lbfd -lws2_32 -lwinmm -luser32 -lm -lkernel32 -lintl -liberty -lgdi32 -lc -ladvapi32

修改後:

LIBS = -lbfd -lws2_32 -lwinmm -luser32 -lm -lkernel32 -lintl -lc -liberty -lgdi32 -ladvapi32

現在再跑s3c2410x-2.6.14的測試,哈哈!終于成功了!

繼續閱讀