0 Preface/Foreword
1 代码
1.1 源代码
#include <stdio.h>
#include <string.h>
int sum(int a, int b);
int sum_alias(int a, int b) __attribute__ ((alias("sum")));
int main()
{
int ret = 0;
ret = sum(5, 5) + sum_alias(5, 5);
printf("ret is :%d\n", ret);
return ret;
}
int sum(int a, int b)
{
return (a+b);
}
函数声明别名注意事项:
- 新函数只是旧函数的别名,调用新函数,实际上是调用旧函数
- 新函数的参数个数和返回类型必须和旧函数完全一致
- 新函数声明必须放在旧函数声明或者实现之后
1.2 运行结果
1.3 C程序从源码到可执行文件过程(编译过程)
流程如下:
- 预处理,将源文件翻译成符合编译器语法的文件, gcc -E, 等于工具cpp,生成的文件格式为*.i
- 编译,将源文件编译成汇编文件*.S. gcc -S,等同于工具cc -S,生成的文件格式为*.S
- 汇编,将汇编文件转成目标文件*.o,该文件为可重定向文件,relocatable. gcc -c, 等同工具as,生成的文件格式为*.o
- 链接,将其他目标文件,系统库文件,目标文件生成系统可执行文件, gcc , 等同于工具ld
1.3.1 预处理
1.3.2 编译
1.3.3 汇编
1.3.4 链接
2 使用场景
通过条件编译控制汇编代码块,汇编代码块中包含了函数调用,带该函数未实现,属于预留。