2011年6月30日 星期四

CodeSourcery g++

心血來潮突然想用最新的compiler 來編譯 autoboot

下載了 mips-sde-elf-gcc 之後
 ( MIPS 的 sde  已經結束,交由 codesourcery 繼續 )
( 有 mips-elf 及 mips-linux 2種版本)
主要是 Link system 不一樣 ( ABI ?)

簡單說
mips-elf 是針對 bare-metal system ,沒有OS 的 compiler,
link 的時候要指定 linker script ( -T scriptfile )
而 mips-linux 就是針對 linux 的啦

CodeSourcery 的 compiler 不需要 cygwin
但是跟 cygwin 相容,可以在 cygwin 下使用。
這點很重要,因為大部份的 makefile 都是給 X-nix 的

裝好後( 選add to PATH) 試著編譯
出現 no input file 訊息
用舊的 sde-gcc 同樣的命令則無問題
表示 codesourcery 沒設定好

因為 cygwin 下,路徑名是 Linux 式的而非 Windows Path
所以要下
export CYGPATH=cygpath ( ref. Starter Guide)

export CYGPATH=xxxx\bin\cygpath

這樣CS 就會呼叫 cygpath 這個utility 來調整路徑

調整好後繼續編譯,在link的時候出現
cannot find -lc
這是因為找不到 library libc.a

設定好 config file 中的 LIBPATH 指到CS目錄下的lib
然後 -lc 換成 -lgcc (因為CS下沒有 libc.a 只有 libgcc.a )
就可以了

或者 -lc 拿掉,不指定 library,也可以過...


2個重點
1. export CYGPATH=cygpath
2. c library link problem

接下來分享並紀錄一下 gcc 的一些參數

-l  statically link library, -lc 就是 libc.a  -lgcc 就是 libgcc.a
-L lib link directory
-EL use little endian lib
-T specify linker script
-Wa,xxxx  pass xxx option to assembler, -Wa 後面加逗號就是 pass 給assembler 的參數


編譯完後的 booter.rec.elf 檔比原來大很多 (345k vs 224k)
可能是library的關係?

但是booter.rec 大小差不多。


note: 編譯中有出現一個問題
用新的 gcc ( 4.5.2 ) vs 3.4.4
在nand.c 會出現error



static NandDevice nand_devices[] =
    {
        { //Toshiba TC58DVM92A1FT00
            .description("Toshiba 8-bit Flash"),
            .model("TC58DVM92A1FT00"),
            .maker(0x98),
            .device_id(0x76),
            .data_width(8),
            .page_size(528),
            .spare_area_size(16),
            .page_count(32),
            .block_count(4096),
            .cs_dont_care(0),
            .sequential_read(1)
        },
        { //Samsung K9F1216U0A-YCB0
            .description("Samsung 16-bit Flash"),
            .model("K9F1216U0A-YCB0"),
            .maker(0xEC),
            .device_id(0x56),
            .data_width(16),
            .page_size(528),
            .spare_area_size(16),
            .page_count(32),
            .block_count(4096),
            .cs_dont_care(1),
            .sequential_read(0)
        },
...

};


typedef struct
{
char* description;
char* model;
int maker;
int device_id;
int data_width;
int page_size;
int spare_area_size;
int page_count;
int block_count;
int cs_dont_care;
int sequential_read;
} NandDevice;

其中


 .description("Toshiba 8-bit Flash"), 會出現錯誤


改成
 .description = "Toshiba 8-bit Flash", 就 ok了
 .description = {"Toshiba 8-bit Flash" }, 的話會出現 near initialization warning

全部的 .data(XXX)  改成 .data = "XXX" 就可以過了

.data(XXX) initialize 的語法好像是 gcc 以前獨有的
可以參考
http://tigcc.ticalc.org/doc/gnuexts.html

C99 的initialization 有大改,而gcc 4 應該是符合 C99 所以 old code cannot compile

沒有留言: