gcc命令系列

文章目录

  • gcc编译链接原理及使用
    • 1、gcc 和 arm-linux-gcc的常用选项
    • canci
  • ubuntu下面gcc -S
    • 换个代码看差别
  • gcc命令大全
    • 产生汇编语言,且根据汇编语言产生exe
    • gcc指定编译位数

gcc编译链接原理及使用

1、gcc 和 arm-linux-gcc的常用选项

  • gcc 【选项】 文件名

  • -v:查看gcc 编译器的版本,显示gcc执行时的详细过程

  • -o < file > 指定输出文件名为file,这个名称不能跟源文件名同名

  • -E  只预处理,不会编译、汇编、链接

  • -S       Compile only; do not assemble or link

  • -c        Compile and assemble, but do not link

未完待续

canci

  • 添加链接描述

ubuntu下面gcc -S

#include 

void main()

{
int i=0;
printf ("%d\n",i);

}
	.file	"A.c"
	.section	.rodata
.LC0:
	.string	"%d\n"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	$0, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
	.section	.note.GNU-stack,"",@progbits
  • 我把他改为
	.file	"A.c"
	.section	.rodata
.LC0:
	.string	"%d\n"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	$0, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	$1234567, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
	.section	.note.GNU-stack,"",@progbits

$.LC0是干啥的啊??

  • gcc A.s
  • ./a.out

gcc命令系列_第1张图片

换个代码看差别


#include 

void main()

{
int i=0;
scanf("%d\t\t\n",&i);
printf ("%d\n",i);
printf ("%d\n",i);
}


	.file	"A.c"
	.section	.rodata
.LC0:
	.string	"%d\t\t\n"
.LC1:
	.string	"%d\n"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	$0, -4(%rbp)
	leaq	-4(%rbp), %rax
	movq	%rax, %rsi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	__isoc99_scanf
	movl	-4(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC1, %edi
	movl	$0, %eax
	call	printf
	movl	-4(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC1, %edi
	movl	$0, %eax
	call	printf
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
	.section	.note.GNU-stack,"",@progbits

gcc命令大全

产生汇编语言,且根据汇编语言产生exe

  • gcc -S
/* A.c */
#include  
int main() 
{ 
    printf("helloworld!/n"); 
    return 0; 
} 

gcc命令系列_第2张图片

	.file	"A.c"
	.text
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
LC0:
	.ascii "helloworld!/n\0"
	.text
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB13:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	call	___main
	movl	$LC0, (%esp)
	call	_printf
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE13:
	.ident	"GCC: (MinGW.org GCC-8.2.0-5) 8.2.0"
	.def	_printf;	.scl	2;	.type	32;	.endef

  • 汇编语言咋产生exe呢??
  • 只需gcc A.s -o haha

gcc命令系列_第3张图片

gcc指定编译位数

  • gcc -m64 A.cpp -o A
#include 
int main()
{
	int a = 12;
	printf("%d\n", sizeof(a));
	long b = 12;
	printf("%d", sizeof(b));
}
  • 却报错了
    在这里插入图片描述
  • 可能我的gcc是32位,没法使用这个吧
    • 这是匪夷所思啊

你可能感兴趣的:(GNU+linux下工具)