Linux內核如何才能使用GCC進行編譯?對於某些項目來說,哪些GNU C擴展真的是必要的,爲什麼?有哪些GNU C擴展可用,這些擴展在C99中實現並不重要?
6
A
回答
8
本文解釋使用的擴展:GCC hacks in the Linux kernel。其中一些是微不足道的,有些不是(主要是優化技巧)。
1
GCC支持Nested Functions,它不是C99標準的一部分。也就是說,需要進行一些分析,以瞭解它們在Linux內核中的實際流行程度。
0
我想這不是他們真的那必要的。只是有很多有用的東西,交叉編譯器的可移植性對Linux內核來說並不是什麼大問題。更不用說爲了擺脫依賴擴展而需要的大量工作。
2
Linux內核被編寫成由GCC編譯,因此標準兼容對於內核開發人員來說從來不是一個目標。
如果GCC提供了一些有用的擴展,使得編碼更容易或編譯內核更小或更快,那麼使用這些擴展是自然的選擇。
7
這裏有一對夫婦的gcc擴展了Linux內核使用:
- 聯彙編
- GCC內建命令,如__builtin_expect,__ builtin_constant,__ builtin_return_address
- 功能屬性來指定例如(例如__attribute __((regparm(0)),__ attribute __((packed,aligned(PAGE_SIZE))))))
- 取決於gcc預定義宏的特定代碼(例如某些版本中某些gcc錯誤的解決方法)
- 範圍在開關的情況下(情況8 ... 15 :)
這裏有幾個:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
大部分這些GCC細節都非常依賴於體系結構,或者是因爲GCC是如何成爲可能實施,並且可能沒有意義由C標準指定。其他的只是C的擴展。由於Linux內核的構建依賴於這些擴展,所以其他編譯器必須提供與gcc相同的擴展才能構建內核。
並非Linux 有依賴於gcc的這些功能,例如, NetBSD內核很少依賴gcc特定的東西。
相關問題
- 1. NetworkX有哪些可擴展性問題?
- 2. 如何知道擴展類時要實現哪些方法
- 3. GNU C擴展文檔:它在哪裏?
- 4. 在C++中實現可擴展代碼
- 5. TYPO3 - 擴展新字段的extbase擴展,並在流體模板中使用這些擴展
- 6. 我在哪裏可以找到這些擴展的MIME類型?
- 7. 擴展範圍中有哪些變量可用(如窗口,gBrowser)?
- 8. Angular 4擴展並實現
- 9. Directory.GetFiles某些擴展
- 10. Java - 擴展一個類並重用這些方法?
- 11. 擴展MouseAdapter並實現ActionListener
- 12. ANSI C有哪些最常用的擴展(或使用)?
- 13. 擴展現有的Firefox擴展/在自己的擴展中使用現有Firefox擴展的功能
- 14. Firefox擴展中應該放置哪些實用功能
- 15. 警告:GNU擴展
- 16. 類擴展的實現在哪裏?
- 17. 這隻會允許某些擴展嗎?
- 18. 哪些GLSL ES擴展在各種iOS設備上可用?
- 19. 哪些PaaS最適合需要擴展的Meteor JS應用?
- 20. 實現CSS可摺疊不擴展
- 21. Python:os.listdir替代/某些擴展
- 22. 如何禁用GNU C擴展?
- 23. 哪個PHP擴展實現了shm_attach?
- 24. PDO擴展需要這個適配器,但擴展不加載
- 25. 爲什麼我們需要在android中擴展類時實現某些方法?
- 26. 「用戶可擴展=否」或不「用戶可擴展=否」
- 27. 編寫firefox或chrome擴展需要哪些技能? (如Adblock)
- 28. 這些值都可以在媒體來源擴展被檢測
- 29. 選擇鉻擴展中的元素有哪些方法?
- 30. GNU內存泄漏並行擴展
如果你捅了你,你可以找到一個問題,鏈接到已成功構建Linux的其他編譯器。至少對於某些內核版本,'tcc'可以做到這一點。 – dmckee 2010-04-20 20:54:25
標題和問題不一致。 – 2010-04-20 20:58:56
dmckee:Linux內核需要修補一下才能使用tcc編譯。 – Yktula 2010-04-20 21:18:23