C程序的基础系统代码

原创 2016年05月31日 10:00:02

一、简单C程序的构建过程:

[root@test]# gcc -v  hello.c 

//首先是gcc搜集系统信息
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix


//接下来编译器cc1开始工作了,他的任务是将hello.c编译成.s文件。

//首先显示的是gcc自己的版本信息,显示收集到的编译选项(其中-v是我们命令行传入的,其他的是他自己采用的)。

//然后显示gcc 调用cc1的命令行。由于命令行带了-v,所以接下来cc1也详细输出了自己的工作过程。这里生成的汇编文件名为/tmp/ccI5PLHj.s


gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'

/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/cc1 -quiet -v hello.c -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase byte_order -version -o /tmp/ccI5PLHj.s

GNU C (GCC) version 4.8.2 20140120 (Red Hat 4.8.2-16) (x86_64-redhat-linux)
        compiled by GNU C version 4.8.2 20140120 (Red Hat 4.8.2-16), GMP version 5.1.1, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
 /usr/local/include
 /usr/include
End of search list.


//接下来汇编器as开始工作了。同样是gcc先显示相关信息,然后调用as的命令行。由于带了-v选项,as也输出了自己的相关信息。最终生成了目标文件/tmp/ccVS4a59.o
GNU C (GCC) version 4.8.2 20140120 (Red Hat 4.8.2-16) (x86_64-redhat-linux)
        compiled by GNU C version 4.8.2 20140120 (Red Hat 4.8.2-16), GMP version 5.1.1, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 16ae14b2bdacde6ba28f48ff4516d12b
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'

 as -v --64 -o /tmp/ccVS4a59.o /tmp/ccI5PLHj.s

GNU assembler version 2.23.2 (x86_64-unknown-linux-gnu) using BFD version (GNU Binutils) 2.23.2


//最后链接器登场。可见gcc调用的是collect2完成链接。collect2最终估计还是调用ld完成实际的链接操作。但这里看不出来。
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.2/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.2/:/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.2/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../.. /tmp/ccVS4a59.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../lib64/crtn.o



二、C程序包含的基础目标文件:

从上一节的最后一步,可以看出,有4个基础的目标文件,被链接到了最终的可执行程序中。他们是:

/usr/lib64/crt1.o
/usr/lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/crtbegin.o   
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/crtend.o 
/usr/lib64/crtn.o

通过objdump可以看出,crt1.o中包含了符号_start。而通过ld --verbose命令,可以看出默认链接脚本中,有ENTRY(_start)这一项。这些信息说明,用户态程序加载后,第一条被执行的指令位于_start符号处。而_start符号又位于crt1.o中



版权声明:本文没有任何版权限制,任何人可以以任何方式使用本文。

linux系统的指令基础2(系统的健康状况、进程杀死、脱离终端运行程序、C程序的编译、makefile文件,使用cd指令定位到root目录)

1.使用远程桌面控制的,需在linux上安装vnc服务,安装指令: sudo apt-get install tightvncserver 第一次使用要设置密码,其会要求输入两次密码,其也是以后修改密...

C 代码基础知识

  • 2014年07月19日 19:10
  • 172KB
  • 下载

C基础代码培训班里面的哦

  • 2012年02月02日 23:21
  • 825KB
  • 下载

【分享】一些经典的C/C++语言基础算法及代码(二)

阅读到的一些经典C/C++语言算法及代码。在此分享。 4、打印三角形和金字塔 用" * "打印半金字塔 #include using namespace std; int main() { ...

JNI基础(六)C调java代码

java如何调用C代码,大概已经了解了,通过是先本地方法来调用。那么C代码如何代用java代码 套路与思路:通过反射 java代码: public class MainActivity exte...

在C/C++代码中使用SSE等指令集的指令(3)SSE指令集基础

相关参考: http://edu.gamfe.com/tutor/d/11820.html http://blog.163.com/chenqneu@126/blog/static/4573848...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C程序的基础系统代码
举报原因:
原因补充:

(最多只允许输入30个字)