GCC Spec Files

by thinker
2 Columns
關鍵字:

雜記
Open source 常見的 toolchain,就非 gcc 和 binutils 系列莫屬。然而,商業公司提供的 toolchain,往往必需安裝在特定目錄,這總是惹惱有潔癖者,如我。然而,若將 toolchain 任意搬動位置,則會曝露 gcc 的一個缺陷,gcc 找不到其它幅程式或 library 。這是因為 gcc 假設 library 和 toolchain 會安裝在固定位置,於是在 build toolchain 時,就將這些路徑設定死。於是,對於不想重新 build toolchain,或只拿到 binary 的 user 而言,就必需使用 -nostdlib 這個參數,然後加上一堆 -I 和 -L 參數,使 gcc 能正確的找到 library 。

另外,一些 toolchain ,因為平台的因素,無法使用 gcc 預設好的參數內容。於是要強迫使用者必需下一堆固定的參數,例如: Android 就在其 build system 裡,為 gcc 設定一堆和平台相關的參數,像是 -mthumb。於是,若使用該 toolchain 自行開發軟體,就誓必要找出這些參數,並正確的設定為 gcc 的參數。這完全是一堆苦工。其實,只要作 toolchain 的人多用點心,使用 toolchain 其實可以不用這麼累。

sysroot

一般而言,gcc 會到 /usr/lib 和 /usr/include 下找 library 、 header files 和其它一些 start files 、 end files。當我們在 build gcc 設定 --prefix=/path/to/xxx ,則 gcc 安裝到 /path/to/xxx ,也在該目錄下的 lib/ 和 include/ 找 library 和 header 。旦,若裝 gcc 移到其它目錄時, gcc 會找不到這些 library 。這時,我們可以在呼叫 gcc 時,給予 --sysrooot=/new/path/to/xxx 參數。如此,gcc 就會改以 /new/path/to/xxx 為參考目錄,去搜尋所需的幅程式和 library 等。

然而,要注意的是, ld 必需要能 support --sysroot。這必需在 configure binutils 時,給予 --sysroot=xxx 參數。xxx 可以是任意目錄,不一定是實際安裝的位置。這個參數的主要目的是使 ld 啟動 --sysroot 的功能。

Spec File

--sysroot 解決了一部分問題,但有更大部分的問題是 toolchain 往往要你設定一些固定參數。例如,你會需要設定一些 header file 的目錄,並且設定一些平台有關的參數。這些設定往往又臭又長,很容易出錯。其實,這些參數可以寫在 spec file 裡,使用者就不用一再的重復指定這些參數。例如,以下是我為 Android 設定的 spec file 的內容

%rename cc1_android old_cc1_android
%rename cc1plus_android old_cc1plus_android*android_root:
%R/../../../../../*android_product:
generic*ccflags:
%{!march=:-march=armv5te} %{!mtune=:-mtune=xscale} -mthumb \
-fno-strict-aliasing -finline-limit=64 -mthumb-interwork \
-fno-short-enums \
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__ \
-isystem %(android_root)bionic/libc/arch-arm/include/ \
-isystem %(android_root)bionic/libc/include \
-isystem %(android_root)bionic/libstdc++/include \
-isystem %(android_root)bionic/libc/kernel/common \
-isystem %(android_root)bionic/libc/kernel/arch-arm \
-isystem %(android_root)bionic/libm/include \
-isystem %(android_root)bionic/libm/include/arch/arm \
-isystem %(android_root)bionic/libthread_db/include \
-include %(android_root)system/core/include/arch/linux-arm/AndroidConfig.h \
-isystem %(android_root)system/core/include/arch/linux-arm/*cc1_android:
%(old_cc1_android) %(ccflags)*cc1plus_android:
%(old_cc1plus_android) %(ccflags)

像 Android 的 header files 就散置在一堆目錄,於是 build system 就指定了一堆參數。如果你自己寫個小程式,又不使用 Android 的 build system 時,就必需自己指定這些參數。於是,有人寫了一個 perl 的小程式,作為 gcc 的 wrapper ,幫你指定一些參數。其實不用這麼麻煩,只需像上例一樣,設定一個 spec file ,在執行 gcc 時加上一個參數就能自動套用這些參數

  • gcc -specs myandroid.specs

spec file 設計的很有彈性,可以對參數列的內容進行修改,也可以加入條件性的參數。像上例 {!march=:...} 就是指定,當參數列沒有指定 -march= 的參數時,就在 cc1 的參數例加入 -march=armv5te。另外我還指定了一些巨集和 -system 指定一些 header file 的路徑。而這些路徑是相對於 %R ,也就是 --sysroot 所指定的路。例如 --sysroot=/my/path/to/the/kkk/ ,則 %(android_root)bionic/libm/include/arch/arm 就會對應到 /my/path/to/th/kkk/../../../../../bionic/libm/include/arch/arm 。

更進一步

--sysroot 的預設內容,其實是可以設定成相對於 gcc 本身的位置。在 configure 時,若

configure --with-sysroot='${exec_prefix}/xxx'

則編譯出來的 gcc ,其 sysroot 就會相對於其執行路徑。如此 user 甚至不必再手動指定 --sysroot 。

結論

有了 spec files ,我們只需設定 -specs 和 --sysroot 兩個參數就能解決所有的問題。其實在建 toolchain 時,應該再多花一點時間,幫 user 作好 spec files 。這樣的 toolchain 才方便使用。 關於 spec file 更詳細的內容,請參考 Spec Files

GCC Spec Files相关推荐

  1. linux spec文档解析

    编译目录组成介绍 rpm-build 包和  /usr/src/redhat ,这些 rpm build 的程序是要靠 spec 文件的控制.它是配置指定安装到另外的机器上的,用来指示转换的源码补丁编 ...

  2. 【rpm】源码包制作rpm包|修改rpm、重新制作rpm包

    目录 前言 安装rpmbuild rpmbuild制作rpm 包 同时生成devel包 修改rpm.重新制作rpm包 RPM 打包 工具 SPEC文件 spec文件关键字说明大全 rpmbuild的目 ...

  3. RPM打包探索(rpm-max翻译整理)

    1. %global 和 %define 的区别? 这是内置宏,%define用来定义宏,%global用来定义一个全局可见的宏(在整个spec文件中可见) 2. %{!?macro-name} 和 ...

  4. 使用Tape和Vue Test Utils编写快速的Vue单元测试

    by Edd Yerburgh 埃德·耶堡(Edd Yerburgh) 使用Tape和Vue Test Utils编写快速的Vue单元测试 (Write blazing fast Vue unit t ...

  5. PacBio sequence error correction amd assemble via pacBioToCA

    Illumina二代测序有个致命缺陷,说到底还是基于PCR扩增的,所以存在偏向性和对于高GC含量区无法扩增等系统误差,测序错误是不可避免的,其次就是测序长度短:但其价格便宜,通量非常高,准确性达99% ...

  6. linux libpath的作用,linux – LD_LIBRARY_PATH似乎不起作用

    我正在尝试编译测试文件: gcc -o test test.c -lg2c 但我得到错误: /usr/bin/ld: cannot find -lg2c 如果我使用: gcc -o test test ...

  7. exe解包和重新打包_pyinstaller打包的exe太大?你需要嵌入式python玄学 前提篇

    pyinstaller打包一个exe动辄几十M几百M (特别是import pandas以后) 知乎上居然没有人po这方面的"知识"(手动狗头) 查了很多关于reduce pyin ...

  8. DockOne微信分享(八十四):Docker在B站的实施之路

    本文讲的是DockOne微信分享(八十四):Docker在B站的实施之路[编者的话]B站一直在关注Docker的发展,去年成功在核心SLB(Tengine)集群上实施了Docker.今年我们对比了各种 ...

  9. Linux 应用---make及makefile的编写

    Make 在我们做linux 开发中是必不可少的一部分,它在我们编写大型项目工程文件中起到非常大的作用. Make工程管理器也就是个"自动编译管理器",这里的"自动&qu ...

  10. 前端测试框架 jasmine 的使用

    最近的项目在使用AngulaJs,对JS代码的测试问题就摆在了面前.通过对比我们选择了 Karma  + jasmine ,使用 Jasmine做单元测试 ,Karma 自动化完成,当然了如果使用 K ...

最新文章

  1. 据廖雪峰python3教程----python学习第二天
  2. CSP认证201709-1 打酱油[C++题解]:贪心
  3. 一个几何级数的无限和思考
  4. 74-A/D指标,Accumulation/Distribution,积累/派发线,离散指标.(2015.7.1)
  5. CSS3 伪类和伪元素
  6. 诺基亚9 PureView五摄机皇再曝光 低配高价毫无诚意?
  7. intouch的报警怎么发到邮件上
  8. html5新增graph,Qunee for HTML5 - 中文 : Graph组件介绍
  9. php获取扫码枪的内容,C#_C#实现简单获取扫码枪信息代码,一个扫码枪遵循TCP协议,通过 - phpStudy...
  10. Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决!
  11. 流程图基础绘制方法和流程图制作软件功能详解
  12. win10照片查看器_Win10 下好用的免费无广告看图软件 XnView
  13. Springboot文件上传报错:failed to convert java.lang.String to org.springframework.util.unit.DataSize
  14. windows下安装与使用pix2tex(mathpix免费替代版)
  15. mtatlas mysql_MHA-Atlas-MySQL高可用(下)
  16. SpringCloud入门 —— SSO 单点登录
  17. eoLinker-AMS接口管理系统 项目管理教程
  18. CNN卷积核计算原理
  19. 2022年硝化工艺判断题及答案
  20. Windows10下载安装openjdk11及配置环境变量

热门文章

  1. ScrollView嵌套GridView,自定义Gridview动态设置Item的高度,屏幕适配
  2. 对vue.config.js中的代理服务器的理解
  3. vue-router的编程式导航
  4. 网页设计图片向上浮动_CSS实现图片向上浮动
  5. python io多路复用_Python之路--协程/IO多路复用
  6. java 不同时区时间转换_Java中的时区转换小结
  7. robotframework自动化测试修炼宝典_软件测试工程师必备:Robot Framework实现接口自动化实践!...
  8. mysql数据词典生成markdown_老板让我把数据库字典导出到Markdown格式的文件
  9. 玻璃质感_现代质感的顶层公寓,玻璃扶手让楼梯整个变透明!
  10. Springboot的工作机制:4 再谈谈自动配置