2010-04-20 53 views
6

Linux內核如何才能使用GCC進行編譯?對於某些項目來說,哪些GNU C擴展真的是必要的,爲什麼?有哪些GNU C擴展可用,這些擴展在C99中實現並不重要?

+0

如果你捅了你,你可以找到一個問題,鏈接到已成功構建Linux的其他編譯器。至少對於某些內核版本,'tcc'可以做到這一點。 – dmckee 2010-04-20 20:54:25

+1

標題和問題不一致。 – 2010-04-20 20:58:56

+0

dmckee:Linux內核需要修補一下才能使用tcc編譯。 – Yktula 2010-04-20 21:18:23

回答

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特定的東西。