C语言-目标文件/链接文件
原创
©著作权归作者所有:来自51CTO博客作者文天大人的原创作品,请联系作者获取转载授权,否则将追究法律责任
(1) 使用intel语法的GCC内联汇编打印字符串
建立一个源文件,叫source.c
,编辑内容如下,定义一个char数组,然后在屏幕上显示出来,下面的代码gcc之后,会在屏幕上打印出abc
int main(int a,char arg[]){
char arr[]="abc\n";
__asm__(
"mov rax,1;"
"mov rdi,1;"
"syscall;"
:
:"S"(arr),"d"(4);注意此处大写S小写d
);
}
//使用intel汇编翻译,会生成一个a.out的文件
//-masm=intel表示使用英特尔的汇编指令集
gcc source.c -masm=intel
//执行a.out程序
./a.out
(2) 修改上述代码,并编译成目标文件
目标文件:接下来我们让source.c
中只有一个打印的功能函数,由于没有main函数,所以这种文件只能使用-c命令将其编译成目标文件,代码如下
void printf(char * arr,int lenth){
__asm__(
"mov rax,1;"
"mov rdi,1;"
"syscall;"
:
:"S"(arr),"d"(lenth)
);
}
使用如下命令编译
// 下面命令执行完毕会生成一个叫做source.o的文件
gcc -c source.c -masm=intel
接下来新建一个main.c文件,写一个main函数,在main函数中调用printff函数
void printff(char *,unsigned int len);
int main(){
char arr[] ="hello world!";
printff(arr,12);
}
使用如下命令编译
// 下面命令执行完毕会生成一个叫做main.o的文件
// 因为main.c使用了printf函数,而main.c并不知道printf函数在哪里
// 所以该文件也需要编译成链接文件才行
gcc -c main.c
(3) 此时,有main.o和source.o两个目标文件了,执行下面的命令将这两个文件链接起来(合并起来)
// 下面的命令执行完毕会生成一个叫做a.out的文件
gcc source.o main.o
运行a.out
// 下面的命令执行完毕会打印出hellow world!(没换行)
./a.out
上面的步骤有些繁琐,但是能很好的说明什么是目标文件和链接文件,下面的代码可以一步完成
// 下面的命令执行完毕会生成一个叫做a.out的文件
gcc main.c source.c -masm=intel
下一篇:库的创建