用GCC输出带源代码的汇编程序进行链接的调试

原创 2012年03月26日 16:50:57

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7395418

一个可执行程序的形成,大致的步骤:编译——>链接——>可执行文件,然而,犯错最多的地方可能你以为是编译阶段,但是,实际上是链接阶段,特别是大型工程。下面用一个例子简单说下出现链接错误的一个简单解决方式,先看两个程序:

//main.c
void test1();
void test2();

int main()
{
	test1();
	test2();
	return 0;
}

//test.c
#include <stdio.h>

static void test1()
{
	printf("This is test1\n");
}

void test2()
{
	printf("This is test2\n");
	test1();
}

这两个简单的程序也没干啥,就是用来测试的,先编译:

gcc -c main.c

gcc -c test.c

没有错误,生成了main.o 和 test.o两个目标文件,接下来链接:

gcc -o main main.o test.o

出现了下面的错误:

main.o: In function `main':
main.c:(.text+0x7): undefined reference to `test1'
collect2: ld returned 1 exit status

意思是没有定义test1,可能此时你已经知道了错误的原因及地方,可以改了,但是试想一下如果工程巨大,很多地方用了test1,你这时就需要另外方法了(除非你用的是IDE,这里我们不讨论)。再仔细看看,还给了另一条信息:main.c:(.text+0x7),这就是出错位置,但是这时汇编的位置,所以我们要深入汇编,可以用下面的命令:

gcc -c -g -Wa,-adlhn main.c >/dev/null

objdump -S main.o >log

查看log:

main.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:

void test1();
void test2();

int main()
{
   0:	55                   	push   %ebp
   1:	89 e5                	mov    %esp,%ebp
   3:	83 e4 f0             	and    $0xfffffff0,%esp
	test1();
   6:	e8 fc ff ff ff       	call   7 <main+0x7>
	test2();
   b:	e8 fc ff ff ff       	call   c <main+0xc>
	return 0;
  10:	b8 00 00 00 00       	mov    $0x0,%eax
}
  15:	c9                   	leave  
  16:	c3                   	ret    
就会发现.text+0x7的位置是在调用test1()的地方,现在到test.c会发现test1()的类型前加了static,这就显示的告诉编译器这个函数只在本文件可见,这里当然还涉及到的static、extern等类型修饰字有空再开贴说明……

【static&extern】用GCC输出带源代码的汇编程序进行链接的调试

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7395418 一个可执行程序的形成,大致的步骤:编译——>链接——>可执行文件,...
  • beMyBest
  • beMyBest
  • 2015年09月28日 21:49
  • 357

有什么软件可以编译汇编程序?

nasm masm mingw 都可以编汇编 Redasm  masmplus cygwin+vim+nasm 都是比较常用的组合。 至于用什么从网上直接下载就行。...
  • daniel_fei
  • daniel_fei
  • 2017年05月19日 16:23
  • 320

1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。

在linux环境下简单编写一个输入0-9的小程序,给大家演示一下linux下的【预处理】【编译】【汇编】【链接】 首先,在vim的编辑器下写一个简单的小程序,如下图: 然后使用预处理选项 ...
  • wuxinrenping
  • wuxinrenping
  • 2017年10月26日 21:07
  • 140

[Intel汇编-MASM]源程序的组成以及编译调试

1. 以第一个汇编源程序为例说明: assume cs:codesg codesg segment mov ax, 0123H mov bx, 0456H add ax, bx ...
  • Lirx_Tech
  • Lirx_Tech
  • 2014年12月17日 15:34
  • 1047

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试。本文主要介绍调试C/C++在Linux操作系统下主要的调试工具。在Linux下写程序,C/C++...
  • bendanban
  • bendanban
  • 2014年08月04日 20:23
  • 10644

GCC输出带C源代码的汇编文件

摘要: 使用GCC输出带C源代码的汇编文件,这样便于对应着源代码来查看汇编代码 关键字: GCC  源代码 汇编 使用GCC输出带C源代码的汇编文件有两种方式, 第一种方式 gcc –c ...
  • lanxinju
  • lanxinju
  • 2010年09月22日 17:24
  • 8020

用GCC输出带C源代码注释的汇编列表文件

 我们都知道gcc的-S开关可以用来生成汇编代码,但有时候,单有汇编文件是不够的,我们希望的是将C语言程序的源代码和汇编语言文本交错在一起查看,这是LISTING功能,在gcc中并没有专门的FAQ说明...
  • DelphiNew
  • DelphiNew
  • 2009年09月08日 04:30
  • 6610

【opencv】如何配置修改并调试opencv源代码

这篇文章主要介绍如何通过vs2012配置opencv,然后再具体修改调试opencv的代码。1、配置opencv工程项目这里主要是介绍如何通过vs2012编译源代码,具体步骤可以参考:【OpenCV入...
  • jaych
  • jaych
  • 2016年03月31日 20:59
  • 4237

汇编调试程序Debug使用

汇编调试程序Debug使用
  • Notzuonotdied
  • Notzuonotdied
  • 2017年04月28日 13:06
  • 1824

查看gcc编译链接的过程

http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FKernelTech%2FKernelStudy%2FM.119182523...
  • sourthstar
  • sourthstar
  • 2012年09月15日 13:49
  • 1196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用GCC输出带源代码的汇编程序进行链接的调试
举报原因:
原因补充:

(最多只允许输入30个字)