这第一步当然是编译了
找到一个比较好的解释C编译的文章,装载一下:
编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件
1.编译预处理
读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理
[析] 伪指令主要包括以下四个方面
(1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉
(3)头文件包含指令,如#include "FileName"或者#include <FileName>等。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。
包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。
(4)特殊符号,预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
2.编译阶段
经过预编译得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,/,等等。预编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
3.优化阶段
优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。上图中,我们将优化阶段放在编译程序的后面,这是一种比较笼统的表示。
对于前一种优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。
后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高,也是一个重要的研究课题。
经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。
4.汇编过程
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
目标文件由段组成。通常一个目标文件中至少有两个段:
代码段 该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
数据段 主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。
UNIX环境下主要有三种类型的目标文件:
(1)可重定位文件 其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据。
(2)共享的目标文件 这种文件存放了适合于在两种上下文里链接的代码和数据。第一种事链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个目标文件;第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。
(3)可执行文件 它包含了一个可以被操作系统创建一个进程来执行之的文件。
汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。
5.链接程序
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2)动态链接在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
经过上述五个过程,C源程序就最终被转换成可执行文件了。缺省情况下这个可执行文件的名字被命名为a.out。
上面的文章出自:http://blog.csdn.net/zjl_1026_2001/archive/2007/11/30/1909813.aspx
下面是我自己的操作的过程:
-bash-3.00$ vi hello.c --编辑源文件
#include <stdio.h>
printf("Hello Linux/n");
}
"hello.c" 4L, 82C 已写入
E138: 不能写入 viminfo 文件 /home/zxin10/.viminfo !
请按 ENTER 或其它命令继续
-bash-3.00$ gcc -E hello.c -o hello.i --预处理
-bash-3.00$ vi hello.i --预处理后的文件
# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3
# 28 "/usr/include/stdio.h" 3
# 1 "/usr/include/features.h" 1 3
# 314 "/usr/include/features.h" 3
# 1 "/usr/include/sys/cdefs.h" 1 3
# 315 "/usr/include/features.h" 2 3
# 337 "/usr/include/features.h" 3
# 1 "/usr/include/gnu/stubs.h" 1 3
# 338 "/usr/include/features.h" 2 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 1 3
# 213 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 3
typedef unsigned int size_t;
# 35 "/usr/include/stdio.h" 2 3
# 1 "/usr/include/bits/types.h" 1 3
# 28 "/usr/include/bits/types.h" 3
# 1 "/usr/include/bits/wordsize.h" 1 3
# 29 "/usr/include/bits/types.h" 2 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 1 3
# 32 "/usr/include/bits/types.h" 2 3
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
__extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;
__extension__ typedef long long int __quad_t;
__extension__ typedef unsigned long long int __u_quad_t;
# 129 "/usr/include/bits/types.h" 3
# 1 "/usr/include/bits/typesizes.h" 1 3
# 130 "/usr/include/bits/types.h" 2 3
__extension__ typedef __u_quad_t __dev_t;
__extension__ typedef unsigned int __uid_t;
__extension__ typedef unsigned int __gid_t;
__extension__ typedef unsigned long int __ino_t;
__extension__ typedef __u_quad_t __ino64_t;
__extension__ typedef unsigned int __mode_t;
__extension__ typedef unsigned int __nlink_t;
__extension__ typedef long int __off_t;
__extension__ typedef __quad_t __off64_t;
__extension__ typedef int __pid_t;
__extension__ typedef struct { int __val[2]; } __fsid_t;
__extension__ typedef long int __clock_t;
__extension__ typedef unsigned long int __rlim_t;
__extension__ typedef __u_quad_t __rlim64_t;
__extension__ typedef unsigned int __id_t;
__extension__ typedef long int __time_t;
__extension__ typedef unsigned int __useconds_t;
__extension__ typedef long int __suseconds_t;
__extension__ typedef int __daddr_t;
__extension__ typedef long int __swblk_t;
__extension__ typedef int __key_t;
__extension__ typedef int __clockid_t;
__extension__ typedef int __timer_t;
__extension__ typedef long int __blksize_t;
__extension__ typedef long int __blkcnt_t;
__extension__ typedef __quad_t __blkcnt64_t;
__extension__ typedef unsigned long int __fsblkcnt_t;
__extension__ typedef __u_quad_t __fsblkcnt64_t;
__extension__ typedef unsigned long int __fsfilcnt_t;
__extension__ typedef __u_quad_t __fsfilcnt64_t;
__extension__ typedef int __ssize_t;
typedef __off64_t __loff_t;
typedef __quad_t *__qaddr_t;
typedef char *__caddr_t;
__extension__ typedef int __intptr_t;
__extension__ typedef unsigned int __socklen_t;
# 37 "/usr/include/stdio.h" 2 3
typedef struct _IO_FILE FILE;
# 62 "/usr/include/stdio.h" 3
typedef struct _IO_FILE __FILE;
# 72 "/usr/include/stdio.h" 3
# 1 "/usr/include/libio.h" 1 3
# 32 "/usr/include/libio.h" 3
# 1 "/usr/include/_G_config.h" 1 3
# 14 "/usr/include/_G_config.h" 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 1 3
# 325 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 3
typedef long int wchar_t;
# 354 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 3
typedef unsigned int wint_t;
# 15 "/usr/include/_G_config.h" 2 3
# 24 "/usr/include/_G_config.h" 3
# 1 "/usr/include/wchar.h" 1 3
# 48 "/usr/include/wchar.h" 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 1 3
# 49 "/usr/include/wchar.h" 2 3
# 1 "/usr/include/bits/wchar.h" 1 3
# 51 "/usr/include/wchar.h" 2 3
# 76 "/usr/include/wchar.h" 3
typedef struct
{
int __count;
union
{
wint_t __wch;
char __wchb[4];
} __value;
} __mbstate_t;
# 25 "/usr/include/_G_config.h" 2 3
typedef struct
{
__off_t __pos;
__mbstate_t __state;
} _G_fpos_t;
typedef struct
{
__off64_t __pos;
__mbstate_t __state;
} _G_fpos64_t;
# 44 "/usr/include/_G_config.h" 3
# 1 "/usr/include/gconv.h" 1 3
# 28 "/usr/include/gconv.h" 3
# 1 "/usr/include/wchar.h" 1 3
# 48 "/usr/include/wchar.h" 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 1 3
# 49 "/usr/include/wchar.h" 2 3
# 29 "/usr/include/gconv.h" 2 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stddef.h" 1 3
# 32 "/usr/include/gconv.h" 2 3
enum
{
__GCONV_OK = 0,
__GCONV_NOCONV,
__GCONV_NODB,
__GCONV_NOMEM,
__GCONV_EMPTY_INPUT,
__GCONV_FULL_OUTPUT,
__GCONV_ILLEGAL_INPUT,
__GCONV_INCOMPLETE_INPUT,
__GCONV_ILLEGAL_DESCRIPTOR,
__GCONV_INTERNAL_ERROR
};
enum
{
__GCONV_IS_LAST = 0x0001,
__GCONV_IGNORE_ERRORS = 0x0002
};
struct __gconv_step;
struct __gconv_step_data;
struct __gconv_loaded_object;
struct __gconv_trans_data;
typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
__const unsigned char **, __const unsigned char *,
unsigned char **, size_t *, int, int);
typedef wint_t (*__gconv_btowc_fct) (struct __gconv_step *, unsigned char);
typedef int (*__gconv_init_fct) (struct __gconv_step *);
typedef void (*__gconv_end_fct) (struct __gconv_step *);
typedef int (*__gconv_trans_fct) (struct __gconv_step *,
struct __gconv_step_data *, void *,
__const unsigned char *,
__const unsigned char **,
__const unsigned char *, unsigned char **,
size_t *);
typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *,
__const unsigned char *,
unsigned char *, unsigned char *);
typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***,
size_t *);
typedef int (*__gconv_trans_init_fct) (void **, const char *);
typedef void (*__gconv_trans_end_fct) (void *);
struct __gconv_trans_data
{
__gconv_trans_fct __trans_fct;
__gconv_trans_context_fct __trans_context_fct;
__gconv_trans_end_fct __trans_end_fct;
void *__data;
struct __gconv_trans_data *__next;
};
struct __gconv_step
{
struct __gconv_loaded_object *__shlib_handle;
__const char *__modname;
int __counter;
char *__from_name;
char *__to_name;
__gconv_fct __fct;
__gconv_btowc_fct __btowc_fct;
__gconv_init_fct __init_fct;
__gconv_end_fct __end_fct;
int __min_needed_from;
int __max_needed_from;
int __min_needed_to;
int __max_needed_to;
int __stateful;
void *__data;
};
struct __gconv_step_data
{
unsigned char *__outbuf;
unsigned char *__outbufend;
int __flags;
int __invocation_counter;
int __internal_use;
__mbstate_t *__statep;
__mbstate_t __state;
struct __gconv_trans_data *__trans;
};
typedef struct __gconv_info
{
size_t __nsteps;
struct __gconv_step *__steps;
__extension__ struct __gconv_step_data __data [];
} *__gconv_t;
# 45 "/usr/include/_G_config.h" 2 3
typedef union
{
struct __gconv_info __cd;
struct
{
struct __gconv_info __cd;
struct __gconv_step_data __data;
} __combined;
} _G_iconv_t;
typedef int _G_int16_t __attribute__ ((__mode__ (__HI__)));
typedef int _G_int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__)));
# 33 "/usr/include/libio.h" 2 3
# 53 "/usr/include/libio.h" 3
# 1 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stdarg.h" 1 3
# 43 "/usr/lib/gcc-lib/i386-turbo-linux/3.2.3/include/stdarg.h" 3
typedef __builtin_va_list __gnuc_va_list;
# 54 "/usr/include/libio.h" 2 3
# 166 "/usr/include/libio.h" 3
struct _IO_jump_t; struct _IO_FILE;
# 176 "/usr/include/libio.h" 3
typedef void _IO_lock_t;
struct _IO_marker {
struct _IO_marker *_next;
struct _IO_FILE *_sbuf;
int _pos;
# 199 "/usr/include/libio.h" 3
};
enum __codecvt_result
{
__codecvt_ok,
__codecvt_partial,
__codecvt_error,
__codecvt_noconv
};
# 267 "/usr/include/libio.h" 3
struct _IO_FILE {
int _flags;
char* _IO_read_ptr;
char* _IO_read_end;
char* _IO_read_base;
char* _IO_write_base;
char* _IO_write_ptr;
char* _IO_write_end;
char* _IO_buf_base;
char* _IO_buf_end;
char *_IO_save_base;
char *_IO_backup_base;
char *_IO_save_end;
struct _IO_marker *_markers;
struct _IO_FILE *_chain;
int _fileno;
int _flags2;
__off_t _old_offset;
unsigned short _cur_column;
signed char _vtable_offset;
char _shortbuf[1];
_IO_lock_t *_lock;
# 315 "/usr/include/libio.h" 3
__off64_t _offset;
void *__pad1;
void *__pad2;
int _mode;
char _unused2[15 * sizeof (int) - 2 * sizeof (void *)];
};
typedef struct _IO_FILE _IO_FILE;
struct _IO_FILE_plus;
extern struct _IO_FILE_plus _IO_2_1_stdin_;
extern struct _IO_FILE_plus _IO_2_1_stdout_;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
# 354 "/usr/include/libio.h" 3
typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf,
size_t __n);
typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
typedef int __io_close_fn (void *__cookie);
# 406 "/usr/include/libio.h" 3
extern int __underflow (_IO_FILE *) ;
extern int __uflow (_IO_FILE *) ;
extern int __overflow (_IO_FILE *, int) ;
extern wint_t __wunderflow (_IO_FILE *) ;
extern wint_t __wuflow (_IO_FILE *) ;
extern wint_t __woverflow (_IO_FILE *, wint_t) ;
# 444 "/usr/include/libio.h" 3
extern int _IO_getc (_IO_FILE *__fp) ;
extern int _IO_putc (int __c, _IO_FILE *__fp) ;
extern int _IO_feof (_IO_FILE *__fp) ;
extern int _IO_ferror (_IO_FILE *__fp) ;
extern int _IO_peekc_locked (_IO_FILE *__fp) ;
extern void _IO_flockfile (_IO_FILE *) ;
extern void _IO_funlockfile (_IO_FILE *) ;
extern int _IO_ftrylockfile (_IO_FILE *) ;
# 474 "/usr/include/libio.h" 3
extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
__gnuc_va_list, int *__restrict) ;
extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
__gnuc_va_list) ;
extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t) ;
extern size_t _IO_sgetn (_IO_FILE *, void *, size_t) ;
extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int) ;
extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int) ;
extern void _IO_free_backup_area (_IO_FILE *) ;
# 73 "/usr/include/stdio.h" 2 3
# 86 "/usr/include/stdio.h" 3
typedef _G_fpos_t fpos_t;
# 138 "/usr/include/stdio.h" 3
# 1 "/usr/include/bits/stdio_lim.h" 1 3
# 139 "/usr/include/stdio.h" 2 3
extern struct _IO_FILE *stdin;
extern struct _IO_FILE *stdout;
extern struct _IO_FILE *stderr;
extern int remove (__const char *__filename) ;
extern int rename (__const char *__old, __const char *__new) ;
extern FILE *tmpfile (void);
# 180 "/usr/include/stdio.h" 3
extern char *tmpnam (char *__s) ;
extern char *tmpnam_r (char *__s) ;
# 198 "/usr/include/stdio.h" 3
extern char *tempnam (__const char *__dir, __const char *__pfx)
__attribute__ ((__malloc__));
extern int fclose (FILE *__stream);
extern int fflush (FILE *__stream);
# 223 "/usr/include/stdio.h" 3
extern int fflush_unlocked (FILE *__stream);
# 237 "/usr/include/stdio.h" 3
extern FILE *fopen (__const char *__restrict __filename,
__const char *__restrict __modes);
extern FILE *freopen (__const char *__restrict __filename,
__const char *__restrict __modes,
FILE *__restrict __stream);
# 264 "/usr/include/stdio.h" 3
# 275 "/usr/include/stdio.h" 3
extern FILE *fdopen (int __fd, __const char *__modes) ;
# 296 "/usr/include/stdio.h" 3
extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) ;
extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
int __modes, size_t __n) ;
extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
size_t __size) ;
extern void setlinebuf (FILE *__stream) ;
extern int fprintf (FILE *__restrict __stream,
__const char *__restrict __format, ...);
extern int printf (__const char *__restrict __format, ...);
extern int sprintf (char *__restrict __s,
__const char *__restrict __format, ...) ;
extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg);
extern int vprintf (__const char *__restrict __format, __gnuc_va_list __arg);
extern int vsprintf (char *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg) ;
extern int snprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
extern int vsnprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, __gnuc_va_list __arg)
__attribute__ ((__format__ (__printf__, 3, 0)));
# 390 "/usr/include/stdio.h" 3
extern int fscanf (FILE *__restrict __stream,
__const char *__restrict __format, ...);
extern int scanf (__const char *__restrict __format, ...);
extern int sscanf (__const char *__restrict __s,
__const char *__restrict __format, ...) ;
# 432 "/usr/include/stdio.h" 3
extern int fgetc (FILE *__stream);
extern int getc (FILE *__stream);
extern int getchar (void);
# 456 "/usr/include/stdio.h" 3
extern int getc_unlocked (FILE *__stream);
extern int getchar_unlocked (void);
# 467 "/usr/include/stdio.h" 3
extern int fgetc_unlocked (FILE *__stream);
extern int fputc (int __c, FILE *__stream);
extern int putc (int __c, FILE *__stream);
extern int putchar (int __c);
# 500 "/usr/include/stdio.h" 3
extern int fputc_unlocked (int __c, FILE *__stream);
extern int putc_unlocked (int __c, FILE *__stream);
extern int putchar_unlocked (int __c);
extern int getw (FILE *__stream);
extern int putw (int __w, FILE *__stream);
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream);
extern char *gets (char *__s);
# 580 "/usr/include/stdio.h" 3
extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);
extern int puts (__const char *__s);
extern int ungetc (int __c, FILE *__stream);
extern size_t fread (void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream);
extern size_t fwrite (__const void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __s);
# 633 "/usr/include/stdio.h" 3
extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream);
extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream);
extern int fseek (FILE *__stream, long int __off, int __whence);
extern long int ftell (FILE *__stream);
extern void rewind (FILE *__stream);
# 688 "/usr/include/stdio.h" 3
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
extern int fsetpos (FILE *__stream, __const fpos_t *__pos);
# 711 "/usr/include/stdio.h" 3
# 720 "/usr/include/stdio.h" 3
extern void clearerr (FILE *__stream) ;
extern int feof (FILE *__stream) ;
extern int ferror (FILE *__stream) ;
extern void clearerr_unlocked (FILE *__stream) ;
extern int feof_unlocked (FILE *__stream) ;
extern int ferror_unlocked (FILE *__stream) ;
extern void perror (__const char *__s);
# 1 "/usr/include/bits/sys_errlist.h" 1 3
# 27 "/usr/include/bits/sys_errlist.h" 3
extern int sys_nerr;
extern __const char *__const sys_errlist[];
# 750 "/usr/include/stdio.h" 2 3
extern int fileno (FILE *__stream) ;
extern int fileno_unlocked (FILE *__stream) ;
# 769 "/usr/include/stdio.h" 3
extern FILE *popen (__const char *__command, __const char *__modes);
extern int pclose (FILE *__stream);
extern char *ctermid (char *__s) ;
# 809 "/usr/include/stdio.h" 3
extern void flockfile (FILE *__stream) ;
extern int ftrylockfile (FILE *__stream) ;
extern void funlockfile (FILE *__stream) ;
# 836 "/usr/include/stdio.h" 3
# 2 "hello.c" 2
int main (int argc, char **argv) {
printf("Hello Linux/n");
E138: 不能写入 viminfo 文件 /home/zxin10/.viminfo !
请按 ENTER 或其它命令继续
-bash-3.00$ gcc -S hello.i -o hello.s --翻译成汇编程序
-bash-3.00$ vi hello.s --汇编程序源文件
.section .rodata
.text
.type main,@function
ret
.ident "GCC: (GNU) 3.2.3 20030502 (TurboLinux 3.2.3-47.3)"
E138: 不能写入 viminfo 文件 /home/zxin10/.viminfo !
请按 ENTER 或其它命令继续
-bash-3.00$ gcc -c hello.s -o hello.o --编译成机器指令
-bash-3.00$ vi hello.o --机器指令原文件
^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^A^@^C^@^A^@^@^@^@^@^@^@^@^@^@^@?[1m^@^@^@^@^@^@^@4^@^@^@^@^@(^@^K^@^H^@U~I?[1m~C?[1m^H~C漯?[1m^@^@^@^@椟~C?[1m^P擅^@^@Hello Linux
^@^@GCC: (GNU) 3.2.3 20030502 (TurboLinux 3.2.3-47.3)^@^@.symtab^@.strtab^@.shstrtab^@.rel.text^@.data^@.bss^@.rodata^@.note.GNU-stack^@.comment^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^_^@^@^@^A^@^@^@^F^@^@^@^@^@^@^@4^@^@^@"^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@^[^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@/^C^@^@^P^@^@^@ ^@^@^@^A^@^@^@^D^@^@^@^H^@^@^@%^@^@^@^A^@^@^@^C^@^@^@^@^@^@^@X^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@+^@^@^@^H^@^@^@^C^@^@^@^@^@^@^@X^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@0^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@X^@^@^@^M^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@8^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@e^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@H^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@e^@^@^@3^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^Q^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@~X^@^@^@Q^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@?[1m^B^@^@| ^@^@^@
^@^@^@^H^@^@^@^D^@^@^@^P^@^@^@ ^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@D^C^@^@^U^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^D^@?^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^F^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@ ^@^@^@^@^@^@^@"^@^@^@^R^@^A^@^N^@^@^@^@^@^@^@^@^@^@^@^P^@^@^@^@hello.c^@main^@printf^@^@^@^@^T^@^@^@^A^E^@^@^Y^@^@^@^B ^@^@
E138: 不能写入 viminfo 文件 /home/zxin10/.viminfo !
请按 ENTER 或其它命令继续
-bash-3.00$ gcc hello.o -o hello --链接成可执行文件
-bash-3.00$ vi hello --可执行文件
^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^B^@^C^@^A^@^@^@ ~C^D^H4^@^@^@(^H^@^@^@^@^@^@4^@ ^@^G^@(^@^/^@^Y^@^F^@^@^@4^@^@^@4~@^D^H4~@^D^H?[1m^@^^@^@^@^E^@^@^@^D^@^@^@^C^@^@^@^T^A^@^@^T~A^D^H^T~A^D^H^S^@^@^@^S^@^@^@^D^@^@^@^A^@^@^@^A^@^@^@^@^@^@^@^@~@^D^H^@~@^D^HM^E^@^@M^E^@^@^E^@^@^@^@^P^@^@^A^@^@^@P^E^@^@P~U^D^HP~U^D^H^L^A^@^@$^A^@^@^F^@^@^@^@^P^@^@^B^@^@^@d^E^@^@d~U^D^Hd~U^D^H?[1m^@^@^@?[1m^@^@^@^F^@^@^@^D^@^@^@(^A^@^@(~A^D^H(~A^D^H ^@^@^@ ^@^@^@^D^@^@^@^D^@^@^@Q錿d^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^G^@^@^@^D^@^@^@/lib/ld-linux.so.2^@^@^D^@^@^@^P^@^@^@^A^@^@^@GNU^@^@^@^@^@^B^@^@^@^B^@^@^@^E^@^@^@^C^@^@^@^G^@^@^@^F^@^@^@^C^@^@^@^E^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@K^@^@^@?[1m~B^D^H$^@^@^@"^@^@^@^R^@^@^@?[1m~B^D^H^]^@^@^@"^@^^@^@^@^@^@?[1m^@^@^@^R^@^@^@^K^@^@^@^@^@^@^@)^@^@^@^R^@^@^@*^@^@^@<~E^D^H^D^@^@^@^Q^@^N^@a^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@libc.so.6^ntf^@__deregister_frame_info^@_IO_stdin_used^@__libc_start_main^@__register_frame_info^@__gmon_start__^@GLIBC_2.0^@^@^@^B^@^B^@^B^@^B^@^A^@^@^@^A^@^A^@^A^@^@^@^P^@^@^@^@^@^@^@^Pii^M^@^@^B^@p^@^@^@^@^@^@^@,~V^D^H^F^F^@^@<~V^D^H^G^A^@^@@~V^D^H^G^B^@^@D~V^D^H^G^C^@^@H~V^D^H^G^D^@^@U~I?[1m~C?[1m^H?[1m~A^@^@^@?[1m^X^A^@^@?[1m^S^B^@^@擅^@54~V^D^H%8~V^D^H^@^@^@^@%<~V^D^Hh^@^@^@^@猷%@~V^D^^D^Hh^P^@^@^@槔%H~V^D^Hh^X^@^@^@榘1韃~I?[1m~C漯PTRh~T~D^D^Hh@~D^D^HQVh^/~D^D^H杩?[1m~P~PU~I錝?[1m^@^@^@^@[~A勉^R^@^@R~K蠿[擅~P~P~P~P~P~P~P~P~P~P~PU~I?[1m~C?[1m^H~K^UX~V^D^H~E襲I~K^UT~V^D^H~K^B~E纓^Z~Mt&^@~MB^D~V^D^H^R~K^UT~V^D^H~K
~E蓇旮?[1m~B^D^H~E纓^P~C?[1m^LhP~U^D^H?~C?[1m^P?[1m^A^@^@^@~V^D^H~I靅?[1m~Mv^@U~I?[1m~C?[1m^H~I靅?[1m~M?[1m^@^@^@^@U~U^D^H柽?~C?[1m^P~I靅?[1m~P~M?^@^@^@^@U~I?[1m~C?[1m^H~I靅?[1m~P~PU~I?[1m~C?[1m^H~C漯?[1m^@^@^@^@)?[1m~C?[1m^Lh@~E^D^H枳?~C?[1m^P擅~P~PU~I錡VS~C?[1m^L?[1m^@^@^@^@[~A免?[15;1H^Q^@^@鑎?~M~C$~M~S$~IE??隽?[1m^B9苨^V~I?[1m~I?^T?[1m~KM?^B~C?[1m^L~Mp?[1m^E~P^T種~C?u麒N^@^@^@~C?[1m^L[^_擅~P~P~P~P~P~P~P~P~P~PU~I錝~C?[1m^D~U^D^H籘~U^D^H~C?t^V~Mv^@~M?^@^@^@^@~X[]肬~I?[1m~C?[1m^H~I靅?[1m~P~PU~I錝?[1m^@^@^@^@[~A?[1m^K^Q^@^@P??Y[擅^@^@^C^@^@^@^A^@^B^@Hello Linux
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^A^@^@^@^L^@^@^@?[1m~B^D^H^M^@^@^@^/~E^D^H^D^@^@^@H~A^D^H^E^@^@^@?[1m~A^D^H^F^@^@^^@^@^@z^@^@^@^K^@^@^@^P^@^@^@^U^@^@^@^@^@^@^@^C^@^@^@0~V^D^H^B^@^@^@ ^@^@^@^T^@^@^@^Q^@^@^@^W^@^@^@~X~B^D^H^Q^@^@^@~P~B^D^H^R^@^@^@^H^@^@^@^S^@^@^@^H^@^@^@?op~B^D^Ho^A^@^@^@?ob~B^D^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@d~U^D^H^@^@^@^@^@^@^@^@?[1m~B^D^H?[1m~B^D^H^F~C^D^H^V~C^D^H^@^@^@^@^@^@^@^@`~U^D^H^@^@^@^@^@GCC: (GNU20041212 (TurboLinux 3.4.3-9.2)^@^@GCC: (GNU) 3.4.3 20041212 (TurboLinux 3.4.3-9.2)^@^@GCC: (GNU) 3.2.3 20030502 (TurboLinux 3.2.3-47.3)^@^@GCC: (GNU) 3.4.3 20041212 (TurboLinux 3.4.3-9.2)^@^H^@^@^@^@^@^@^@^A^@^@^@01.01^@^@^@^H^@^@^@^@^@^@^@^A^@^@^@01.01^@^@^@^@.symtab^@.strtab^@.shstrtab^@.interp^@.note.ABI-tag^@.hash^@.dynsym^@.dynstr^@.gnu.version^@.gnu.version_r^@.rel.dyn^@.rel.plt^@.init^@.text^@.fini^@.rodata^@.eh_frame^@.ctors^@.dtors^@.dynamic^@.got^@.got.plt^@.data^@.bss^@.comment^@.note^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^[^@^@^@^A^@^@^@^B^@^@^@^T~A^D^H^T^A^@^@^S^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@#^@^@^@^G^@^@^@^B^@^@^@(~A^D^H(^A^@^@ ^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@1^@^@^@^E^@^@^@^B^@^@^@H~A^D^HH^A^@^@0^@^@^@^D^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@7^@^@^@^K^@^@^@^B^@^@^@x~A^D^Hx^A^@^@p^@^@^@^E^@^@^@^A^@^@^@^D^@^@^@^P^@^@^@?^@^@^@^C^@^@^@^B^@^@^@?[1D^H?[1m^A^@^@z^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@G^@^@^@o^B^@^@^@b~B^D^Hb^B^@^@^N^@^@^@^D^@^@^@^@^@^@^@^B^@^@^@^B^@^@^@T^@^@^o^B^@^@^@p~B^D^Hp^B^@^@ ^@^@^@^E^@^@^@^A^@^@^@^D^@^@^@^@^@^@^@c^@^@^@ ^@^@^@^B^@^@^@~P~B^D^H~P^B^@^@^H^@^@^@^D^@^@^@^@^@^@^@^D^@^@^@^H^@^@^@l^@^@^@ ^@^@^@^B^@^@^@~X~B^D^H~X^B^@^@ ^@^@^@^D^@^@^@^K^@^@^@^D^@^@^@^H^@^@^@u^@^@^@^A^@^@^@^F^@^@^@?[1m~B^D^H?[1m^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@p^@^@^@^A^@^@^@^F^@^@^@?[1m~B^D^H?[1m^B^@^@P^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@{^@^@^@^A^@^@^@ ~C^D^H ^C^@^@?[1m^A^@^@^@^@^@^@^@^@^@^@^P^@^@^@^@^@^@^@~A^@^@^@^A^@^@^@^F^@^@^@^/~E^D^H^/^E^@^@^Z^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@~G^@^@^@^A^@^@^@^B^@^@^@8~E^D^H8^E^@^@^U^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@~O^@^@^@^A^@^@^@^C^@^@^@P~U^D^HP^E^@^@^D^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@~Y^@^@^@^A^@^@^@^C^@^@^@T~U^D^HT^E^@^@^H^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@| ^@^@^@^A^@^@^@^C^@^@^@/~U^D^H/^E^@^@^H^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@?[1m^@^@^@^F^@^@^@^C^@^@^@d~U^D^Hd^E^@^@?[1m^@^@^@^E^@^@^@^@^@^@^@^D^@^@^@^H@^@^@^A^@^@^@^C^@^@^@,~V^D^H,^F^@^@^D^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@?[1m^@^@^@^A^@^@^@^C^@^@^@0~V^D^H0^F^@^@^/^@^@^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@?[1m^@^@^@^A^@^@^@^C^@^@^@L~V^D^HL^F^@^@^P^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@?[1m^@^@^@^H^@^@^@^C^@^@^@/~V^^@^X^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@?[1m^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@/^F^@^@?[1m^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@?[1m^@^@^@^@^@^@^@^@^@%^G^@^@(^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^Q^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@M^G^@^@?[1m^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@~H^L^@^@?[1m^D^@^@^[^@^@^@1^@^@^@^D^@^@^@^P^@^@^@ ^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@H^E138: 不能写入 viminfo 文件 /home/zxin10/.viminfo !
请按 ENTER 或其它命令继续
-bash-3.00$ ./hello --执行
Hello Linux --结果
从这里面可以看出各个步骤