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. GNU C擴展文檔:它在哪裏?
- 3. 在C++中實現可擴展代碼
- 4. 我在哪裏可以找到這些擴展的MIME類型?
- 5. Angular 4擴展並實現
- 6. 擴展範圍中有哪些變量可用(如窗口,gBrowser)?
- 7. ANSI C有哪些最常用的擴展(或使用)?
- 8. 警告:GNU擴展
- 9. 這隻會允許某些擴展嗎?
- 10. 哪些PaaS最適合需要擴展的Meteor JS應用?
- 11. 實現CSS可摺疊不擴展
- 12. Python:os.listdir替代/某些擴展
- 13. 如何禁用GNU C擴展?
- 14. PDO擴展需要這個適配器,但擴展不加載
- 15. 哪個PHP擴展實現了shm_attach?
- 16. 編寫firefox或chrome擴展需要哪些技能? (如Adblock)
- 17. 選擇鉻擴展中的元素有哪些方法?
- 18. 擴展類並實現接口
- 19. 擴展CachedDataAnnotationsModelMetadataProvider不緩存一些DataAnnotations
- 20. GNU as .macro指令擴展
- 21. SAPUI5 - 擴展sap.ui.controller實現
- 22. 實現泛型擴展
- 23. 如何GNU C擴展__attribute __(__ cleanup__)工作?
- 24. 擴展類並實現接口
- 25. 類擴展了另一個類,並在java中實現接口可以被轉換爲anyd這些類型?
- 26. div不擴展表擴展,或div不擴展當它擴大
- 27. 要啓用擴展,驗證它們在這些.ini文件中啓用 - Ubuntu的
- 28. 在Firefox擴展中使用jQuery擴展
- 29. TYPO3 Extbase擴展現有的擴展使用自己的擴展模型?
- 30. 擴展和實現接口
如果你捅了你,你可以找到一個問題,鏈接到已成功構建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