arm-eabi-toolchain/newlib-2013.05/
如何證明有使用 c lib 呢? 試著使用 setjmp/longjmp 並編譯程式, 可以參考以下範例:
https://github.com/descent/stm32f4_prog/tree/master/myjmp
執行後, 運作正確。我實在很驚訝, 作業系統之前的程式怎麼有 standard c library 可用, 我一直以為無法使用 standard c library, 雖然我知道有些和平台無關的 function 是可以拿來用的, ex: memset, strcpy ... 但我沒想到有這麼好的運氣可以使用 standard c library。當然有些底層的東西得要自己補完, 例如令人害怕的 printf。
我非常不建議寫 os kernel 的人使用 standard c library, 每行程式都儘可能由自己完成才是, 否則你就會在 os 技術拼圖上缺了一角, 都搞到這麼底層了, 把所有秘密掀開來, 知道所有一切的結果, 會讓人很充實、開心。
要怎麼完全不用 library 全部都自己手工寫呢? 加上 -nostdlib -nodefaultlibs 即可, 或不是使用任何不是你寫的 function, 這樣就要自己把 setjmp/longjmp 生出來, 成就感十足。
相關 gcc options:
- -nodefaultlibs
- -nostdlib
- -ffreestanding
- -nostartfiles
newlib 提供了很好的範例讓我們參考一個 standard c library 是怎麼做出來的, 不用和 glibc 這種大怪物奮鬥, 若能自己編譯起來執行, 相信底層功力會大增。newlib/newlib/libc/machine/i386/ 下有我們熟悉的 memcmp, memset 的 source code; arm 的部份在 newlib/newlib/libc/machine/arm, 當然, 有可能缺東缺西, 可參考 ref 5 裡的 Howto: Porting newlib A Simple Guide 補上自己所需要的 funcion。不過開發 os 倒不需要用上 standard c library, 相關所需要的 library 本來就要自己打造。
Bionic 是 Android C Library, 也可參考裡頭的實作。
newlib ref:
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。