2009年(11)
分类: C/C++
2009-05-10 16:17:45
|
Reading specs from /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/specs Configured with: /home/bigtree/embedded/tools/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6/gcc-3.4.5/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux --with-float=soft --with-headers=/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux/include --with-local-prefix=/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.5 /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/libexec/gcc/arm-linux/3.4.5/cc1 -quiet -v -D__ARM_ARCH_3__ helloworld.c -quiet -dumpbase helloworld.c -msoft-float -auxbase helloworld -version -o /tmp/ccaykq0x.s #include "..." search starts here: #include <...> search startshere: /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/include /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/sys-include /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/include End of search list. GNU C version 3.4.5 (arm-linux) compiled by GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu4). GGC heuristics: --param ggc-min-expand=62 --param ggc-min-heapsize=60367 /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/bin/as -mfpu=softfpa -o /tmp/cccj0q5Z.o /tmp/ccaykq0x.s /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/libexec/gcc/arm-linux/3.4.5/collect2 --eh-frame-hdr -dynamic-linker /lib/ld-linux.so.2 -X -m armelf_linux -p -o helloworld /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/lib/crt1.o /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/lib/crti.o /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/crtbegin.o -L/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5 -L/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/lib /tmp/cccj0q5Z.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/crtend.o /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/lib/crtn.o |
以下摘取关键部分:
|
|
以上就是helloworld的编译过程。现在我们来看看编译选项-nostartfiles -nostdlib
arm-linux-gcc -v -nostartfiles -o helloworld helloworld.c
出现以下错误:
|
arm-linux-gcc -v -nostdlib -o helloworld helloworld.c
出现以下错误:
/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/libexec/gcc/arm-linux/3.4.5/collect2 --eh-frame-hdr -dynamic-linker /lib/ld-linux.so.2 -X -m armelf_linux -p -o helloworld -L/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5 -L/home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/lib /tmp/ccuvtqHS.o /home/bigtree/embedded/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5/../../../../arm-linux/bin/ld : warning: cannot find entry symbol _start; defaulting to 00008074 /tmp/ccuvtqHS.o(.text+0x10): In function `main': : undefined reference to `printf' collect2: ld returned 1 exit status |
因为printf函数在库文件中实现。
|
可以看见预处理器把所有要包含(include)的文件(包括递归包含的文件)的内容都添加到了原始的C源文件中,然后把其输出到输出文件,除此之外,它还展开了所有的宏定义,所以在预处理器的输出文件中你将找不到任何宏。这也提供了一个查看宏展开结果的简便方法。
第二步“编译”,就是把C/C++代码“翻译”成汇编代码:
|
这个汇编文件比预处理后的C/C++文件小了很多,去除了很多不必要的东西,比如说没用到的类型声明和函数声明等。
第三步“汇编”,将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux上一般表现为ELF目标文件。
bigtree@just:~$ file helloworld.o helloworld.o: ELF 32-bit LSB relocatable, ARM, version 1, not stripped |
|