RHEL 7特性說明(七):編譯程式及工具

發表於2014-07-16

Red Hat Enterprise Linux 7.0 是 Red Hat 的下一代作業系統完整套件,旨在用於關鍵任務企業級計算以及頂級企業級軟體和硬體零售商認證。

GCC 工具鏈

在 Red Hat Enterprise Linux 7.0 中,gcc 工具鏈是根據 gcc-4.8.x 發行系列開發,幷包含大量針對 Red Hat Enterprise Linux 6 的改進和 bug 修復。同樣,Red Hat Enterprise Linux 7 也包含binutils-2.23.52.x。這些版本與 Red Hat Developer Toolset 2.0 中的等效工具對應。Red Hat Enterprise Linux 6 和 Red Hat Enterprise Linux 7 gcc 的 binutils 版本對比請檢視:

https://access.redhat.com/site/documentation/en-US/Red_Hat_Developer_Toolset/2/html/User_Guide/index.html#sect-Changes_in_Version_2.0-GCC

https://access.redhat.com/site/documentation/en-US/Red_Hat_Developer_Toolset/2/html/User_Guide/index.html#sect-Changes_in_Version_2.0-binutils

Red Hat Enterprise Linux 7.0 工具鏈的主要特點如下:

  • 構建符合 C++11 的應用程式的實驗性支援(其中包括所有 C++11 語言支援)和一些 C11 功能的實驗性支援。
  • 改進的並行應用程式程式設計支援,其中包括 OpenMP v3.1, C++11 型別和自動記憶體訪問的 GCC 內嵌,以及事務記憶體的實驗性支援(其中包括 Intel RTM/HLE 行內函數、內嵌以及程式碼生成)。
  • 新的本地註冊分配程式(LRA),提高程式碼效能。
  • DWARF4 現在作為預設 debug 格式使用。
  • 各種新的具體架構選項。
  • 支援 AMD 產品線 15h 和 16h 處理器。
  • 接期(Link-time)優化支援。
  • 改進的警告和診斷。
  • 各種新的 Fortran 功能。

GLIBC

在 Red Hat Enterprise Linux 7.0 中,glibc 庫(libc, libm, libpthread, NSS 外掛及其他)是根據 glibc 2.17 發行本開發的,其中包含大量針對 Red Hat Enterprise Linux 6 對等產品的改進和 bug 修復。

Red Hat Enterprise Linux 7.0 glibc 庫主要特點如下:

  • 實驗性 ISO C11 支援。
  • 新的 Linux 介面:prlimit, prlimit64, fanotify_init, fanotify_mark, clock_adjtime, name_to_handle_at, open_by_handle_at, syncfs, setns, sendmmsg, process_vm_readv, process_vm_writev。
  • 使用流 SIMD 擴充套件(SSE)、補充流 SIMD 擴充套件 3(SSSE3)、流 SIMD 擴充套件 4.2(SSE4.2)以及高階向量擴充套件(AVX)為 AMD64 和 Intel 64 架構新優化的字串功能。
  • 為 IBM PowerPC 和 IBM POWER7 新優化的字串功能。
  • 使用為 IBM System z10 和 IBM zEnterprise 196 特別優化的程式為 IBM S/390 和 IBM System z 新優化的字串功能。
  • 新區域:os_RU, bem_ZA, en_ZA, ff_SN, sw_KE, sw_TZ, lb_LU, wae_CH, yue_HK, lij_IT, mhr_RU, bho_IN, unm_US, es_CU, ta_LK, ayc_PE, doi_IN, ia_FR, mni_IN, nhn_MX, niu_NU, niu_NZ, sat_IN, szl_PL, mag_IN。
  • 新編碼:CP770, CP771, CP772, CP773, CP774。
  • 新介面:scandirat, scandirat64。
  • 已新增檢查 FD_SET, FD_CLR, FD_ISSET, poll 和 ppoll 檔案描述符版本的功能。
  • nscd 守護程式現在支援 netgroup 資料庫快取。
  • 新功能 secure_getenv() 可讓您安全訪問該環境,如果在 SUID 或者 SGID 程式中執行會返回 NULL。這個功能替換了內部功能 __secure_getenv()。
  • 現在如果傳遞違反那些值規範的鹽位元組(salt bytes),crypt() 功能會失效。在 Linux 中,crypt() 功能將檢視 /proc/sys/crypto/fips_enabled 檔案決定是否啟用了 FIPS。如果啟用了該模式,則無法在使用摘要演算法 5(MD5)或者資料加密標準(DES)演算法的加密字串中使用。
  • 現在 clock_* 功能套件(在 <time.h> 中說明)可直接在主 C 庫中使用。之前必須將其與-lrt 連結方可使用這些功能。這一變化的效果是使用此功能的單執行緒程式,比如 clock_gettime()(它未與 -lrt 連結)將不再會在執行時暗自載入 pthreads 庫,同時也不會再受到其他程式碼(比如 C++ 執行時庫)所支援的與多執行緒關聯的消耗的困擾。
  • 新的標頭 <sys/auxv.h> 和功能 getauxval() 可讓您在經過 Linux 核心時輕鬆訪問 AT_* key-value 對。該標頭還定義與 AT_HWCAP 金鑰關聯的 HWCAP_* 二進位制數。
  • 已為低層具體平臺功能記錄了已安裝標頭的新等級。PowerPC 新增第一個附帶功能的事務以便提供基於時間的註冊訪問。

GDB

在 Red Hat Enterprise Linux 7.0 中,GDB 除錯程式來自 gdb-7.6.1 發行本,幷包含大量針對 Red Hat Enterprise Linux 6 作業系統對等產品的改進和 bug 修復。

這個版本與 Red Hat Developer Toolset v2.0 中的 GDB 版本對應,以下列出了 Red Hat Enterprise Linux 6 和 Red Hat Enterprise Linux 7.0 GDB 版本之間的不同:

https://access.redhat.com/site/documentation/en-US/Red_Hat_Developer_Toolset/2/html/User_Guide/index.html#sect-Changes_in_Version_2.0-GDB-Red_Hat_Developer_Toolset_1

https://access.redhat.com/site/documentation/en-US/Red_Hat_Developer_Toolset/2/html/User_Guide/index.html#sect-Changes_in_Version_2.0-GDB-Red_Hat_Enterprise_Linux_6

Red Hat Enterprise Linux 7.0 中包含的 GDB 主要新功能有:

  • 使用新的 .gdb_index 部分和新的 gdb-add-index shell 命令更迅速地載入符號。注:在 Red Hat Enterprise Linux 6.1 及之後的版本中就有這個功能。
  • gdbserver 現在支援標準輸入/輸出(STDIO)連線,例如:(gdb) target remote | ssh myhost gdbserver - hello
  • 使用 -location 引數的 watch 命令有更多行為。
  • 可使用一個新命令 info vtbl 顯示虛擬方法表。
  • 使用新命令 info auto-load, set auto-load 和 show auto-load 控制檔案的自動載入。
  • 使用 set filename-display absolute 命令顯示原始檔名的絕對路徑。
  • 使用新命令 record btrace 控制有硬體支援的流量記錄。

Red Hat Enterprise Linux 7.0 所提供 GDB 的主要 bug 修復如下:

  • 已將 info proc 命令更新為可用於 core 檔案。
  • 在下級的所有匹配的位置中設定斷點。
  • 斷點位置的檔名部分現在與原始檔名稱結尾部分匹配。
  • 現在可在行內函數中使用斷點。
  • 現在可將模板例項化時將模板引數列入範圍。

另外,Red Hat Enterprise Linux 7.0 提供一個新軟體包 gdb-doc,該軟體包包含 PDF、HTML以及資訊格式的 GDB 手冊。該 GDB 手冊在之前的 Red Hat Enterprise Linux 版本中由主 RPM 軟體包提供。

效能工具

Red Hat Enterprise Linux 7.0 中包含對一些效能功能的最新更新版本,比如 oprofilepapi 和elfutils,提供效能、可移植性及功能性改進。

此外還有 Red Hat Enterprise Linux 7.0 首先採用的功能:

  • 支援 Performance Co-Pilot
  • SystemTap 支援在整個非特權使用者空間執行的基於 DynInst 檢測,同時也支援基於 Byteman 的Java 應用程式精確探測。
  • 硬體事務記憶體的 Valgirnd 支援以及向量化建模指令的改進。

⁠12.4.1. Performance Co-Pilot

Red Hat Enterprise Linux 7.0 引進 Performance Co-Pilot(PCP)支援,這是一個用來對系統級效能測定進行採集、歸檔和分析的工具、服務及庫套件。其輕加權、分散式架構的特點使其特別適合複雜系統的集中分析。

可使用 Python、Perl、C++ 介面新增效能指標。分析工具可直接使用這些客戶端 API(Python、C++ 和 C),且大量網頁程式可使用 JSON 介面檢視所有可用效能資料。

有關詳情請參考 pcp 和 pcp-libs-devel 軟體包 man page 中的具體論述。pcp-doc 軟體包包括兩本來自 upstream 專案的免費公開圖書:

http://oss.sgi.com/projects/pcp/doc/pcp-users-and-administrators-guide.pdfhttp://oss.sgi.com/projects/pcp/doc/pcp-programmers-guide.pdf

⁠12.4.2. SystemTap

Red Hat Enterprise Linux 7.0 包含 systemtap 版本 2.4,它可提供一些新功能。這些包括可選的純使用者空間指令碼執行、更豐富且有效的 Java 探測、虛擬機器探測、改進的報錯資訊以及大量 bug 修復和新功能。特別是:

  • 使用 dyninst 二進位制編輯庫,SystemTap 現在可以執行一些純用於使用者空間層的指令碼;無需提供核心或者 root 特權。這個模式可使用 stap --dyninst 選擇,只啟用那些對使用者自己的程式產生影響的探測或者操作型別。注:這個模式與引發 C++ 異常的程式不相容。
  • 與 byteman 工具聯合支援向 Java 應用程式中注入探測的新方法。新的 SystemTap 探測型別 java("com.app").class("class_name").method("name(signature)").*,該探測型別啟用了對進入退出某個應用程式的獨立方法的探測,無需進行系統範圍內的追蹤。
  • 在 SystemTap 驅動程式中新增了新的程式,該程式可以啟用在伺服器中執行的由 libvirt 管理的 KVM 事務中執行遠端任務。它可將編譯的 SystemTap 指令碼通過專門的安全 virtio-serial 連結自動且安全地傳送到虛擬機器中。新的虛擬機器端守護程式將載入該指令碼並將其輸出結果傳送回主機。這個方法比 SSH 更快速、有效,且不需要在主機和虛擬機器之間建立 IP 級網路連線。要測試此功能,請執行以下命令:
    stap --remote=libvirt://MyVirtualMachine
  • 另外,對 SystemTap 診斷資訊有了大量改進:
    • 現在很多資訊給出相關手冊頁供參考。這些頁面給出對出錯資訊的解釋及建議修正。
    • 如果懷疑指令碼輸入包含排版錯誤,則會以分類列表方式向使用者提供建議。當使用者指定名稱與可接受名稱不匹配時會在很多上下文中使用這個建議功能,比如探測功能名稱、標記符、變數、檔案、別名等等。
    • 已改進診斷重複資訊刪除。
    • 在資訊中新增 ANSI 顏色使其更容易理解。

⁠12.4.3. Valgrind

Red Hat Enterprise Linux 7.0 包含一個檢測框架 Valgrind,該框架附帶大量工具用於配置應用程式。這個版本是基於 Valgrind 3.9.0 發行本,且包含針對 Red Hat Enterprise Linux 6 和 Red Hat Developer Toolset 2.0 副本的大量改進,後者是在 Valgrind 3.8.1 的基礎上開發的。

Red Hat Enterprise Linux 7.0 中包含的 Valgrind 的主要新功能如下:

  • 在安裝了 DFP 程式的主機中支援 IBM System z 十進位制浮點指令。
  • 支援 IBM POWER8 (Power ISA 2.07) 指令。
  • 支援 Intel AVX2 指令。注:只適用於 64 位架構。
  • Intel 事務同步擴充套件初期支援,包括受限制事務記憶體(RTM)以及硬體鎖定省略(HIE)。
  • 在 IBM PowerPC 中對硬體事務記憶體的初期支援。
  • 已將轉移快取預設大小增加到 16 個扇區,表現為大程式需要插入並儲存大量程式碼。同樣,可追蹤的與記憶體對映的片段數已增加了 6 倍。轉移快取中的最大扇區數可由新標籤 --num-transtab-sectors 控制。
  • Valgrind 不再臨時生成整個物件的對映以便從中讀取資料,而是通過一個小的固定快取讀取。這樣可在 Valgrind 從大的共享物件中讀取 debug 資訊時避免虛擬記憶體尖波。
  • 使用的禁止顯示列表(如果指定 -v 選項就會顯示)現在為每個使用的禁止顯示提示檔名以及定義禁止顯示的行號。
  • 現在可以使用新標籤 --sigill-diagnostics 控制在即時(just-in-time,JIT)編譯程式遇到它無法轉譯的指令時是否給出診斷資訊。實際行為 — 嚮應用程式發出 SIGILL 訊號 — 保持不變。
  • 已改進 Memcheck 工具,增加了下述功能:
    • 處理向量化程式碼能力的提升,大量減少錯報。使用 --partial-loads-ok=yes 標籤可從中獲益。
    • 更好地控制洩露檢查。現在可以指定應顯示的洩露型別(definite/indirect/possible/reachable),哪些應被視為錯誤,以及哪些應通過給出洩露抑制而禁止顯示。這可通過在 suppression 條目中分別使用選項 --show-leak-kinds=kind1,kind2,..、--errors-for-leak-kinds=kind1,kind2,.. 和自選 match-leak-kinds: 行完成。注:生成的洩露抑制包含這個新行,這比之前的發行本要更具體。要獲取與之前發行本相同的行為,請在使用它們前從生成的抑制中刪除 match-leak-kinds: 行。
    • 使用更好的試探法減少洩露檢查程式中的 possible leak 報告。可用的試探法為std::stdstring、帶有解構函式元素的新[ ]分配的陣列以及指向使用多個繼承的 C++ 專案內建部分提供有效內部指標探測。可使用 --leak-check-heuristics=heur1,heur2,... 選項進行選擇。
    • 對於堆上分配塊更好的 stacktrace 捕獲控制。使用 --keep-stacktraces 選項有可能獨立控制是否為每個分配和取消分配進行棧跟蹤。可使用這個選項生成更好的 “use after free”出錯資訊,或者通過記錄更少的資訊減少 Valgrind 的資源消耗。
    • 更好地報告洩漏禁止顯示使用。已使用禁止顯示列表(指定 -v 選項時會顯示)現在為每個洩漏禁止顯示在上次洩漏搜尋中禁止顯示的塊和位元組數。
  • 使用以下監控命令改進了 Valgrind GDB 伺服器整合:
    • 新的監視器命令 v.info open_fds 給出開啟的檔案描述符及附加資訊列表。
    • 新的監視器命令 v.info execontext 可顯示 Valgrind 記錄的棧追蹤資訊。
    • 新的監視器命令 v.do expensive_sanity_check_general 執行某些內部一致性檢查。

程式語言

⁠Ruby 2.0.0

Red Hat Enterprise Linux 7.0 提供最新的 Ruby 2.0.0。版本 2.0.0 與 Red Hat Enterprise Linux 6 中所包含版本 1.8.7 的主要不同點在於:

  • 新的解釋程式 YARV(另一個 Ruby VM),該程式可限制降低載入時間,特別是那些有大樹結構或者檔案的應用程式。
  • 新且迅速的 "Lazy Sweep" 垃圾收集程式。
  • Ruby 限制支援字串編碼。
  • Ruby 限制支援內部執行緒而不是綠色執行緒。

有關 Ruby 2.0.0 的詳情請參考該專案的 upstream 頁:https://www.ruby-lang.org/en/

⁠Python 2.7.5

Red Hat Enterprise Linux 7.0 包含 Python 2.7.5,它是 Python 2.7 系列發行本的最新版本。這個版本包含很多效能改進,並向前相容 Python 3。Python 2.7.5 中的主要變化如下:

  • 排序的字典型別
  • 快速的 I/O 模組
  • 集合及程式碼詞典解讀
  • sysconfig 模組

有關這些變化的完整列表請參考 http://docs.python.org/dev/whatsnew/2.7.html

⁠Java 7 及多個 JDK

Red Hat Enterprise Linux 提供 OpenJDK7 作為預設 Java 開發套件(JDK),Java 7 作為預設 Java 版本。所有 Java 7 個軟體包(java-1.7.0-openjdkjava-1.7.0-oraclejava-1.7.0-ibm)允許平行安裝多個版本,類似於核心。平行安裝的功能可讓使用者同時嘗試多個 JDK 版本,以便在需要時調節效能並解決問題。準確的 JDK 與原來一樣通過備選方法進行選擇。

 

本系列文章來自 RHEL 7.0 的發行註記,完整內容請移步:https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/7.0_Release_Notes/index.html 

相關文章