免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3002 | 回复: 9
打印 上一主题 下一主题

关于linux下编译链接的详细步骤 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-29 23:30 |只看该作者 |倒序浏览
今天在ubuntu上按照深入理解计算机系统上给的步骤做了个实验:

a.c:
extern int sum(int, int);
int main()
{
        int a = 3;
        int b = 4;
        int c = 8;
        c = sum(a , b);
        return 0;
}
sum.c:
int sum(int a, int b)
{
       return a + b;
}

cpp a.c a.i(预处理)
cc1 a.i -o a.s(获得汇编代码)
as -o a.o a.s (汇编器汇编得到二进制文件)
同样的步骤得到sum.o
ld -o a a.o sum.o (链接)
此时出现warning,大概是说未找到_start符号,设为默认......
./a 出现segment fault
请问以上的步骤为什么会出现错误,是不是少了什么命令,还是命令少加了什么选项。请大虾们赐教。

论坛徽章:
0
2 [报告]
发表于 2010-05-30 08:59 |只看该作者
ld -o a a.o sum.o --dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.4/crtbegin.o /usr/lib/gcc/i486-linux-gnu/4.4/crtend.o /usr/lib/crtn.o -lc

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
3 [报告]
发表于 2010-05-30 10:07 |只看该作者
如果执行

  gcc -o a a.o sum.o -v

你就可以看到gcc调用ld时,所传递给ld的命令行参数,包括额外要链接的运行时库

论坛徽章:
0
4 [报告]
发表于 2010-06-02 12:35 |只看该作者
3ks yoyocall and EricFisher.

论坛徽章:
0
5 [报告]
发表于 2010-06-02 13:01 |只看该作者
回复 2# yoyocall

3ks,yoyocall
可否解释一下这些加上的这些库有什么作用?

论坛徽章:
0
6 [报告]
发表于 2010-06-04 02:39 |只看该作者
那些库主要是运行时库,准备一些运行环境,比如堆栈,进程的起始,终止等。
虽然从C语言的角度看,程序从MAIN开始,到MAIN退出结束。但是从OS的角度看,这之前和之后还有很多东西。

其实如果你想搞明白的话,OBJDUMP 下最后生成的2个文件,看看他们的不同就知道了。

我自己看了下,正常的程序会添加了一堆的辅助函数。

================================
搭车问个问题:

我直接把A.S改了下,不用堆栈,不调用SUM函数,直接把2个寄存器相加,基本就3行代码:
MOVQ $1, %RAX
MOVQ $2, %RBX
ADDQ %RAX, %RBX

运行的话,还是有有SEG FAULT. 用GDB看了下。这3句执行都没问题的。死在了之后的地方。

进程退出的时候还要做哪些特殊处理?有了解的来指点下?

论坛徽章:
0
7 [报告]
发表于 2010-06-04 03:14 |只看该作者
找到答案了。退出的时候要调用SYS_EXIT. 也就是在结束的地方需要如下代码:

        xorl %eax, %eax                # %eax = 0
        incl %eax                # %eax = 1 system call _exit ()
        xorl %ebx, %ebx                # %ebx = 0 normal program return code
        int $0x80                # execute system call _exit ()

PS: 上面这段是32位的,我之前那贴是64位,根据情况调整下即可。

论坛徽章:
0
8 [报告]
发表于 2010-06-04 16:56 |只看该作者
回复 6# accessory


    accessory, 3ks for your answer
我记得大一的时候在windows下用borland的开发环境,那个里面的ld用起来时很方便的,不加参数就可以直接把.o文件链接成可执行文件,没想到gnu的ld用起来这么到讲究。

论坛徽章:
0
9 [报告]
发表于 2010-06-04 22:44 |只看该作者
看你怎么想了吧。
我觉得BORLAND那种,从你说的来看,比如适合新手。
GCC这种,更加灵活些,但是用起来更麻烦些。其实GCC生成的也是可执行文件啊。看你自己想执行啥了。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
10 [报告]
发表于 2010-06-04 23:44 |只看该作者
曾经的 borland传奇
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP