⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8.html

📁 网上一个牛人整理的关于linux内核编译
💻 HTML
📖 第 1 页 / 共 5 页
字号:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
   <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富国,http://winking.126.com">
   <TITLE>gcc</TITLE>
</HEAD>
<BODY style="font-family: 宋体; font-size: 9pt">
&nbsp;
<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" >
<TR>
<TD ALIGN=CENTER><FONT SIZE=+2><!--标题由此开始-->gcc</TD>
</TR>
</TABLE></CENTER>

<p><h3>目       录</h3>
<!--目录由此开始--><A NAME="Content" ID="Content"></A>
<OL><LI><A HREF="#I194">gcc</A></LI>
<OL><LI><A HREF="#I195">makefile写法</A></LI>
<LI><A HREF="#I196">gcc_egcs使用</A></LI>
<LI><A HREF="#I197">gdb使用</A></LI>
<LI><A HREF="#I198">gcc常用选项对代码的影响</A></LI>
<OL><LI><A HREF="#I199">一般情况</A></LI>
<LI><A HREF="#I200">-O 编译选项</A></LI>
<LI><A HREF="#I201">-O2 编译选项</A></LI>
<LI><A HREF="#I202">-fomit-frame-pointer 编译选项</A></LI>
<LI><A HREF="#I203">-fomit-frame-pointer &amp;&amp; -O2</A></LI>
<LI><A HREF="#I204">-fPIC 编译选项</A></LI>
<LI><A HREF="#I205">-static 编译选项</A></LI>
</OL><LI><A HREF="#I206">AT&amp;T的汇编格式</A></LI>
<LI><A HREF="#I207">x86内联汇编</A></LI>
<OL><LI><A HREF="#I208">简述</A></LI>
<LI><A HREF="#I209">内联汇编</A></LI>
<LI><A HREF="#I210">程序模板</A></LI>
<LI><A HREF="#I211">操作数</A></LI>
<LI><A HREF="#I212">修饰寄存器列表</A></LI>
<LI><A HREF="#I213">操作数约束</A></LI>
<LI><A HREF="#I214">示例</A></LI>
<OL><LI><A HREF="#I215">寄存器约束</A></LI>
<LI><A HREF="#I216">匹配约束</A></LI>
<LI><A HREF="#I217">内存操作数约束</A></LI>
<LI><A HREF="#I218">修饰寄存器</A></LI>
</OL></OL><LI><A HREF="#I219">不同的CPU下最佳编译参数</A></LI>
<LI><A HREF="#I343">代码维护</A></LI>
<OL><LI><A HREF="#I344">简单cvs</A></LI>
<LI><A HREF="#I345">automake</A></LI>
<LI><A HREF="#I346">diff</A></LI>
<LI><A HREF="#I347">rcs</A></LI>
<LI><A HREF="#I732">内核重编译常见故障</A></LI>
<LI><A HREF="#I348">cvs</A></LI>
<LI><A HREF="#I349">共享库工具</A></LI>
<LI><A HREF="#I350">代码优化</A></LI>
<LI><A HREF="#I351">GNU 编码标准</A></LI>
<LI><A HREF="#I352">书籍</A></LI></OL></OL></OL>
<hr><br><A NAME="I194" ID="I194"></A><center><b><font size=+2>gcc</font></b></center><br>



<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I195" ID="I195"></A><center><b><font size=+2>makefile写法</font></b></center><br>
蓝森林 http://www.lslnet.com 2001年3月22日 08:44<p>
作 者: 许明彦<p>
Abstract:<p>
&nbsp;&nbsp;&nbsp; 在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式的人。用 make来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完 Overview 就快阵亡了,难怪许多<br>
人闻 Unix 色变。<p>
&nbsp;&nbsp;&nbsp; 本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软体来协助我们『自动』产生 Makefile 档,并且让开发出来的软体可以像 Apache, MySQL 和常见的 GNU 软体一样,只要会 ``./configure'', ``make'', ``make install'' 就可以把程式安装到系统中。如果您有<br>
心开发 Open Source 的软体,或只是想在 Unix 系统下写写程式。希望这份介绍文件能帮助您轻松地进入 Unix Programming 的殿堂。<p>
1. 简介<p>
&nbsp;&nbsp;&nbsp; Makefile 基本上就是『目标』(target), 『关连』(dependencies) 和『动作』三者所组成的一连串规则。而 make 就会根据 Makefile 的规则来决定如何编译 (compile) 和连结 (link) 程式。实际上,make 可做的不只是编译和连结程式,例如 FreeBSD 的 port collect<br>
ion 中, Makefile 还可以做到自动下载原始程式套件,解压缩 (extract) ,修补 (patch),设定,然後编译,安装至系统中。<p>
&nbsp;&nbsp;&nbsp; Makefile 基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。却也因此,许多刚开始学习写 Makefile 时会感到没有规范可循,每个人写出来的 Makefile 长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路<br>
径改一下,可能Makefile 就得跟着修改。虽然有 GNU Makefile Conventions (GNU Makefile 惯例) 订出一些使用 GNU 程式设计时撰写 Makefile 的一些标准和规范,但是内容很长而且很复杂, 并且经常做些调整,为了减轻程式设计师维护 Makefile 的负担,因此有了Automake。<p>
&nbsp;&nbsp;&nbsp; 程式设计师只需写一些预先定义好的巨集 (macro),交给 Automake 处理後会产生一个可供Autoconf 使用的 Makefile.in 档。再配合利用Autoconf 产生的自动设定档 configure即可产生一份符合 GNU Makefile惯例的 Makeifle 了。<p>
2. 上路之前<p>
&nbsp;&nbsp;&nbsp; 在开始试着用 Automake 之前,请先确认你的系统已经安装以下的软体:<br>
1. GNU Automake<br>
2. GNU Autoconf<br>
3. GNU m4<br>
4. perl<br>
5. GNU Libtool (如果你需要产生 shared library)<p>
&nbsp;&nbsp;&nbsp; 我会建议你最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程式来做为开发的环境,这些工具都是属於 Open Source Software不仅免费而且功能强大。如果你是使用Red Hat Linux 可以找到所有上述软体的 rpm 档,FreeBSD 也有现成的 package 可以直<br>
接安装,或着你也可以自行下载这些软体的原始档回来 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的环境下所完成的。<p>
3. 一个简单的例子<p>
&nbsp;&nbsp;&nbsp; Automake 所产生的 Makefile 除了可以做到程式的编译和连结,也已经把如何产生程式文件(如 manual page, info 档及 dvi 档) 的动作,还有把原始程式包装起来以供散 的动作都考虑进去了,所以原始程式所存放的目录架构最好符合 GNU 的标准惯例,接下来我拿hello.c 来做为例子。<p>
&nbsp;&nbsp;&nbsp; 在工作目录下建立一个新的子目录 ``devel'',再在 devel 下建立一个``hello'' 的子目录,这个目录将作为我们存放 hello 这个程式及其相关档案的地方:<p>
% mkdir devel<br>
% cd devel<br>
% mkdir hello<br>
% cd hello<p>
用编辑器写个 hello.c 档,<br>
#include stdio.h<br>
int main(int argc, char** argv)<br>
{<br>
printf(``Hello, GNU! '');<br>
return 0;<br>
}<p>
&nbsp;&nbsp;&nbsp; 接下来就要用 Autoconf 及 Automake 来帮我们产生 Makefile 档了,<p>
1. 用 autoscan 产生一个 configure.in 的雏型,执行 autoscan 後会产生一个configure.scan 的档案,我们可以用它做为configure.in档的蓝本。<p>
% autoscan<br>
% ls<br>
configure.scan hello.c<p>
2. 编辑 configure.scan 档,如下所示,并且把它的档名改成configure.in<br>
dnl Process this file with autoconf to produce a con figure script.<br>
AC_INIT(hello.c)<br>
AM_INIT_AUTOMAKE(hello, 1.0)<br>
dnl Checks for programs.<br>
AC_PROG_CC<br>
dnl Checks for libraries.<br>
dnl Checks for header files.<br>
dnl Checks for typedefs, structures, and compiler ch aracteristics.<br>
dnl Checks for library functions.<br>
AC_OUTPUT(Makefile)<p>
3. 执行 aclocal 和 autoconf ,分别会产生 aclocal.m4 及 configure 两个档案<br>
% aclocal<br>
% autoconf<br>
% ls<br>
aclocal.m4 configure configure.in hello.c<p>
4. 编辑 Makefile.am 档,内容如下<br>
AUTOMAKE_OPTIONS= foreign<br>
bin_PROGRAMS= hello<br>
hello_SOURCES= hello.c<p>
5. 执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in<br>
% automake --add-missing<br>
automake: configure.in: installing `./install-sh'<br>
automake: configure.in: installing `./mkinstalldirs'<br>
automake: configure.in: installing `./missing'<p>
6. 最後执行 ./configure ,<br>
% ./configure<br>
creating cache ./config.cache<br>
checking for a BSD compatible install... /usr/bin/in stall -c<br>
checking whether build environment is sane... yes<br>
checking whether make sets ${MAKE}... yes<br>
checking for working aclocal... found<br>
checking for working autoconf... found<br>
checking for working automake... found<br>
checking for working autoheader... found<br>
checking for working makeinfo... found<br>
checking for gcc... gcc<br>
checking whether the C compiler (gcc ) works... yes<br>
checking whether the C compiler (gcc ) is a cross-co mpiler... no<br>
checking whether we are using GNU C... yes<br>
checking whether gcc accepts -g... yes<br>
updating cache ./config.cache<br>
creating ./config.status<br>
creating Makefile<p>
&nbsp;&nbsp;&nbsp; 现在你的目录下已经产生了一个 Makefile 档,下个 ``make'' 指令就可以开始编译 hello.c 成执行档,执行 ./hello 和 GNU 打声招呼吧!<p>
% make<br>
gcc -DPACKAGE=&quot;hello&quot; -DVERSION=&quot;1.0&quot; -I. -I. -g -O2 -c he llo.c<br>
gcc -g -O2 -o hello hello.o<br>
% ./hello<br>
Hello! GNU!<p>
&nbsp;&nbsp;&nbsp; 你还可以试试 ``make clean'',''make install'',''make dist'' 看看会有什麽结果。你也可以把产生出来的 Makefile 秀给你的老板,让他从此对你刮目相看 :-)<p>
4. 一探究竟<p>
&nbsp;&nbsp;&nbsp; 上述产生 Makefile 的过程和以往自行编写的方式非常不一样,舍弃传统自行定义 make 的规则,使用 Automake 只需用到一些已经定义好的巨集即可。我们把巨集及目标 (target)写在 Makefile.am 档内,Automake读入 Makefile.am 档後会把这一串已经定义好的巨集展<br>
开并且产生对应的Makefile.in 档, 然後再由 configure 这个 shell script 根据Makefile.in 产生适合的 Makefile。<br>
&nbsp;&nbsp;&nbsp; 在此范例中可藉由 Autoconf 及 Automake 工具所产生的档案有 configure.scan、aclocal.m4、configure、Makefile.in,需要我们加入设定者为 configure.in 及 Makefile.am。<p>
4.1 编辑 configure.in 档<p>
&nbsp;&nbsp;&nbsp; Autoconf 是用来产生 'configure' 档的工具。'configure' 是一个shell script,它可以自动设定原始程式以符合各种不同平台上 Unix 系统的特性,并且根据系统叁数及环境产生合适的 Makefile 档或是C 的标头档 (header file),让原始程式可以很方便地在这些不同<br>
的平台上被编译出来。Autoconf 会读取 configure.in 档然後产生 'configure' 这个shell script。<p>
&nbsp;&nbsp;&nbsp; configure.in 档的内容是一连串 GNU m4 的巨集,这些巨集经过autoconf 处理後会变成检查系统特徵的 shell script。configure.in 内巨集的顺序并没有特别的规定,但是每一个 configure.in 档必须在所有巨集前加入 AC_INIT 巨集,然後在所有巨集的最後面加上 AC<br>
_OUTPUT 巨集。我们可先用 autoscan 扫描原始档以产生一个 configure.scan 档,再对 configure.scan 做些修改成 configure.in 档。在范例中所用到的巨集如下:<p>
dnl<br>
&nbsp;&nbsp;&nbsp; 这个巨集後面的字不会被处理,可视为注解。<p>
AC_INIT(FILE)<br>
&nbsp;&nbsp;&nbsp; 这个巨集用来检查原始码所在的路径,autoscan 会自动产生,我们不必修改它。<p>
AM_INIT_AUTOMAKE(PACKAGE,VERSION)<br>
&nbsp;&nbsp;&nbsp; 这是使用 Automake 所必备的巨集,PACKAGE 是我们所要产生软体套件的名称,VERSION 是版本编号。<p>
AC_PROG_CC<br>
&nbsp;&nbsp;&nbsp; 检查系统可用的 C 编译器,如果原始程式是用 C 写的就需要这个巨集。<p>
AC_OUTPUT(FILE)<br>
&nbsp;&nbsp;&nbsp; 设定 configure 所要产生的档案,如果是 Makefile 的话,configure 便会把它检查出来的结果带入 Makefile.in 档然後产生<br>
合适的 Makefile。<p>
&nbsp;&nbsp;&nbsp; 实际上,我们使用 Automake 时,还须要一些其它的巨集,这些额外的巨集我们用 aclocal来帮我们产生。执行 aclocal 会产生 aclocal.m4档,如果没有特别的用途,我们可以不必修改它,用 aclocal 所产生的巨集会告诉 Automake 怎麽做。<p>
&nbsp;&nbsp;&nbsp; 有了 configure.in 及 aclocal.m4 两个档案後,便可以执行 autoconf来产生 configure档了。<p>
4.2 编辑 Makefile.am 档<p>
&nbsp;&nbsp;&nbsp; 接下来我们要编辑 Makefile.am 档,Automake 会根据 configure.in 中的巨集把Makefile.am 转成 Makefile.in 档。Makefile.am 档定义我们所要产的目标:<p>
AUTOMAKE_OPTIONS<br>
&nbsp;&nbsp;&nbsp; 设定 automake 的选项。Automake 主要是帮助开发 GNU 软体的人员维护软体套件,所以在执行 automake 时,会检查目录下是否存在标准 GNU 软体套件中应具备的文件档案,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件档。设成 foreign 时,automake 会改用一般软<br>
体套件的标准来检查。<p>
bin_PROGRAMS<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -