打印
[菜农群课笔记]

20120406群课笔记-c链接器

[复制链接]
2604|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
searover79|  楼主 | 2012-4-6 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20120406群课笔记

20120406群课笔记C链接器(整理).pdf

222.03 KB

20120406群课笔记C链接器(上课发言顺序).pdf

470.53 KB

相关帖子

沙发
searover79|  楼主 | 2012-4-6 22:54 | 只看该作者
John Lee<j.y.lee@yeah.net> 20:25:18
大家好
CountryMan(176419557) 20:25:28
老师好
xieguanhui<w.b.zhang1214@163.com> 20:25:33
老师好
风风(32437089) 20:25:32
FIFO发送完毕之后产生中断
风风(32437089) 20:25:34
老师好
策马西风(577141997) 20:25:40
老师好
searover79(2239458777) 20:25:43
老师好
M0菜地<murex@126.com> 20:25:57
老师好
风风(32437089) 20:26:02
都把字体改小点
风风(32437089) 20:26:08
老师用大的
雁塔菜农<hotwc3@qq.com> 20:26:10
老师好
雪狼(982332664) 20:26:22
老师好
John Lee<j.y.lee@yeah.net> 20:26:56
我找了一本C语言的书,算是照本宣科了。
M0菜地<murex@126.com> 20:27:21

雁塔菜农<hotwc3@qq.com> 20:27:23
什么书?
John Lee<j.y.lee@yeah.net> 20:27:33
书上也写得不错,我也懒得自己写材料了。
雪狼(982332664) 20:27:52
什么书?
John Lee<j.y.lee@yeah.net> 20:28:01
这个先不能说。
雪狼(982332664) 20:28:08

雁塔菜农<hotwc3@qq.com> 20:28:11
有PDF?
M0菜地<murex@126.com> 20:28:25
先开课再说
John Lee<j.y.lee@yeah.net> 20:28:35
今天我就从书里找了一章来讲。
CountryMan(176419557) 20:28:44

雪狼(982332664) 20:28:48

John Lee<j.y.lee@yeah.net> 20:29:19
今天讲的内容是“链接器”。
缥缈九哥(14131338) 20:29:43
起立,老师好。
潜龙思瑞(373744463) 20:30:02
老师好~~~~
雪狼(982332664) 20:30:02
老师好
John Lee<j.y.lee@yeah.net> 20:30:09
这个属于工具链的一环,相当重要,但一般书里介绍得比较少。
缥缈九哥(14131338) 20:30:51
对。我这方面 了解很薄弱。
缥缈九哥(14131338) 20:31:05
有些是自己猜测出来的。没有看过 专业的书。
John Lee<j.y.lee@yeah.net> 20:31:19
很多同学在程序开发过程中,遇到的问题,有一部分就是链接器的问题。
风雨无阻(1062514568) 20:31:36
群里怎么听课啊
雪狼(982332664) 20:31:46
就这样听
潜龙思瑞(373744463) 20:31:49

缥缈九哥(14131338) 20:31:52
就看QQ消息。
雪狼(982332664) 20:31:56

风雨无阻(1062514568) 20:32:29

John Lee<j.y.lee@yeah.net> 20:33:21
一个C程序,可能是由多个分部编译的部分组成,这些不同部分通过一个通常叫做链接器的程序合并成一个整体。
John Lee<j.y.lee@yeah.net> 20:34:44
因为编译器每次只能处理一个文件,所以它不能检测出那些需要一次了解多个源程序文件才能发现的错误。
John Lee<j.y.lee@yeah.net> 20:36:59
而且,在绝大多数系统中,链接器是独立于C编译器实现的,因此如果某些逻辑错误是与C语言本身相关的,链接器也同样束手无策。
策马西风(577141997) 20:37:34
请问这个意思就是多个程序和起来有错误,但是编译器只能检测一个,所以发现不了,是这个意思不?
道可道(549040622) 20:37:54
课间提问。。。
策马西风(577141997) 20:38:04
不好意思
John Lee<j.y.lee@yeah.net> 20:38:14
欢迎提问。
John Lee<j.y.lee@yeah.net> 20:38:37
要不然我怎么知道大家有没有在听?
策马西风(577141997) 20:39:00
哦,谢谢
John Lee<j.y.lee@yeah.net> 20:40:13
编译器一次只能编译一个C程序文件,但一个工程中,可能有多个C文件。
策马西风(577141997) 20:41:00
嗯,
John Lee<j.y.lee@yeah.net> 20:41:08
编译每一个C文件时,都是成功的,但并不意味着整个程序就一定能成功。
策马西风(577141997) 20:41:42
明白
风雨无阻(1062514568) 20:41:53

策马西风(577141997) 20:42:08
就是部分成功,整体有问题
John Lee<j.y.lee@yeah.net> 20:42:15
因为编译器生成的目标文件,需要链接器合并为一个可执行文件,在链接时,也可能发生错误。
John Lee<j.y.lee@yeah.net> 20:43:08
继续。
xieguanhui<w.b.zhang1214@163.com> 20:43:19
C:\Keil\C51\BIN\c51 main.c OJ(M.OBJ)
C:\Keil\C51\BIN\c51 lcd.c OJ(L.OBJ)
C:\Keil\C51\BIN\c51 hzkasc16.c OJ(R.OBJ)
c:\keil\C51\BIN\C51 hzkasc24.c OJ(Z.OBJ)
C:\Keil\C51\BIN\c51 eeprom.c OJ(E.OBJ)
C:\Keil\C51\BIN\c51 user.c OJ(U.OBJ)
C:\Keil\C51\BIN\c51 test.c OJ(T.OBJ)
C:\Keil\C51\BIN\c51 work.c OJ(W.OBJ)
C:\Keil\C51\BIN\A51 startup.a51 OJ(A.OBJ)
C:\Keil\C51\BIN\lx51 A.OBJ,M.OBJ, L.OBJ ,R.OBJ ,Z.OBJ,E.OBJ,U.OBJ,T.OBJ,W.OBJ TO USE   CO(?C_C51STARTUP1(26h))
C:\Keil\C51\BIN\Ohx51 USE
COPY USE.HEX CHIP\USE.HEX


这里的lx51是不是就如你所说的“链接器”器呢??
John Lee<j.y.lee@yeah.net> 20:43:29

John Lee<j.y.lee@yeah.net> 20:44:18
C语言中一个重要的思想就是分别编译,即若干个源程序可以在不同的时候单独编译,然后在恰当的时候整合到一起。
风雨无阻(1062514568) 20:45:11
继续说
John Lee<j.y.lee@yeah.net> 20:46:05
但是,链接器一般是与C编译器分离的,它不可能了解C语言的很多细节。那么,链接器是如何做到把若干个C源程序合并成一个整体呢?
John Lee<j.y.lee@yeah.net> 20:46:50
尽管链接器并不理解C语言,然而它却能够理解机器语言和内存布局。
John Lee<j.y.lee@yeah.net> 20:48:18
编译器的责任是把C源程序“编译”成对链接器有意义的形式,这样链接器就能够“间接理解”C源程序了。
寒雨(251539157) 20:49:04
听课中
(来自手机QQ: http://mobile.qq.com )  
雪狼(982332664) 20:49:08
这种形式是.o类型的文件吗?
John Lee<j.y.lee@yeah.net> 20:49:18

雪狼(982332664) 20:49:26

策马西风(577141997) 20:50:50
老师,请继续
杰GG(225426503) 20:51:51
请继续
John Lee<j.y.lee@yeah.net> 20:51:50
典型的链接器把由编译器或汇编器生成的若干个目标模块(.o),整合成一个可执行文件,该执行文件如果是native的,那么就可以马上运行,如果是cross的,那么就需要下载到目标机上运行。
转战ZigBee(772880135) 20:53:44
怎么区分 执行文件类型是native和cross。  
雪狼(982332664) 20:54:00
在生成native和cross之前,有何区别?
John Lee<j.y.lee@yeah.net> 20:54:02
这些目标模块(.o),其中某些是直接作为输入提供给链接器的,而另外一些则是根据链接过程的需要,从所谓的“库文件”中取得的。
策马西风(577141997) 20:54:14
两种类型有什么区别么?
KiraVerSace<kiraversace@qq.com> 20:54:33
心理委员
转战ZigBee(772880135) 20:54:43

KiraVerSace<kiraversace@qq.com> 20:54:52
现在 还在上课吗
转战ZigBee(772880135) 20:54:53
要来看我了吗
转战ZigBee(772880135) 20:54:58
在啊
KiraVerSace<kiraversace@qq.com> 20:55:06
在哪儿讲?
雪狼(982332664) 20:55:25
正在上课
雪狼(982332664) 20:55:29

John Lee<j.y.lee@yeah.net> 20:55:33
native自然是由native工具链生成的,就是通常说的本机开发工具。
雪狼(982332664) 20:56:01
那cross呢?
John Lee<j.y.lee@yeah.net> 20:56:07
cross是由交叉工具链生成的。
雪狼(982332664) 20:56:31
恩,明白
寒雨(251539157) 20:57:02
嗯   
潜龙思瑞(373744463) 20:57:12
好像平时没用过CROSS
缥缈九哥(14131338) 20:57:23
单片机开发通通是。
John Lee<j.y.lee@yeah.net> 20:57:31
这种工具链,虽然是在本机执行,但生成的执行文件,却是另一种CPU或操作系统的目标代码。
雪狼(982332664) 20:57:45

潜龙思瑞(373744463) 20:58:12
单片机统统是CROSS???
转战ZigBee(772880135) 20:58:29
PC-MCU 就是cros
John Lee<j.y.lee@yeah.net> 20:58:33
9g说得很对,我们平常所用的单片机开发工具,皆是cross tool。
风风(32437089) 20:58:56
这叫交叉编译
转战ZigBee(772880135) 20:59:01

转战ZigBee(772880135) 20:59:05
交叉编译
策马西风(577141997) 20:59:20
明白
John Lee<j.y.lee@yeah.net> 20:59:18
嗯,一般常说的“交叉编译”
寒雨(251539157) 20:59:31
哦   
寒雨(251539157) 20:59:39
这么回事   
寒雨(251539157) 20:59:42
理解   
John Lee<j.y.lee@yeah.net> 21:00:01
但并不严谨,因为除了编译,还需要交叉汇编,交叉链接等等。
John Lee<j.y.lee@yeah.net> 21:00:21
整个就是交叉工具链。
雪狼(982332664) 21:00:40
恩,继续
寒雨(251539157) 21:00:58
哦,加上这些就是一个工具链   
John Lee<j.y.lee@yeah.net> 21:02:09
链接器通常把目标模块看成是由一组外部对象组成的。每个外部对象代表着机器内存中的某个部分,并通过一个外部名称来识别。
John Lee<j.y.lee@yeah.net> 21:03:00
因此,程序中的每个函数和每个外部变量,如果没有声明为static,就都是一个外部对象。
klusday(313536317) 21:04:23
在其它程序文件中能不能调用static定义的函数?
转战ZigBee(772880135) 21:04:34
不能。
KiraVerSace<kiraversace@qq.com> 21:05:05
不能
KiraVerSace<kiraversace@qq.com> 21:05:38
所以static 还可以用来限制本函数 或者本变量 只能在本文件中使用
KiraVerSace<kiraversace@qq.com> 21:05:56
第二个功能呢  就是 保存上一次的值
KiraVerSace<kiraversace@qq.com> 21:06:03
这是在c里面的
KiraVerSace<kiraversace@qq.com> 21:06:15
c++  里面 还有另外一种。
策马西风(577141997) 21:06:44
老师的话,没怎么理解
John Lee<j.y.lee@yeah.net> 21:06:50
一般编译器会改变静态函数和变量的名称,使它们的名字唯一,以避免链接时发生名字冲突。
John Lee<j.y.lee@yeah.net> 21:09:13
例如:
void foo()
{
    static int bar;
    ....
}
对于这种“静态变量”(bar),编译器可能把它的名字加上一些修饰,如:.L_foo_bar之类。
雪狼(982332664) 21:09:25
恩,这也是函数可以重载的原因
John Lee<j.y.lee@yeah.net> 21:09:59
继续
转战ZigBee(772880135) 21:10:03
都讲那么深奥。 重载是C++里面的哦。
雪狼(982332664) 21:10:18
恩,是的
雪狼(982332664) 21:10:30
我搞错了
雪狼(982332664) 21:10:38
不好意思呀
John Lee<j.y.lee@yeah.net> 21:11:12
大多数链接器都禁止同一个.o模块中的两个不同外部对象拥有相同的名字(符号)。
雁塔菜农<hotwc3@qq.com> 21:13:00
我都上传新浪微群了,谁将群课上传园地
John Lee<j.y.lee@yeah.net> 21:13:15
然而,在多个.o模块整合成一个执行文件时,这些.o模块就可能包含了同名的外部对象,链接器的一个重要工作就是处理这类符号冲突。
转战ZigBee(772880135) 21:13:27
  我来。
转战ZigBee(772880135) 21:13:34
没做过菜农的笔记哦。
转战ZigBee(772880135) 21:14:06
我后进来的,前面的内容没有哦,可能有点麻烦。
John Lee<j.y.lee@yeah.net> 21:14:19
处理符号冲突,最简单的办法就是直接报错。
searover79(2239458777) 21:14:26
我传吧
道可道(549040622) 21:14:22
我有
转战ZigBee(772880135) 21:14:57
   报错怎么解决。
John Lee<j.y.lee@yeah.net> 21:16:47
一个C文件中,如果有两个同名的函数,编译器就直接报错了,不会走到链接这一步的。
John Lee<j.y.lee@yeah.net> 21:19:32
但对于不同的.o文件,出现了同名函数的情况,链接器就无法处理了,试想,在一个调用此函数的地方,链接器怎么知道这个调用,应该链接给那个函数?
雪狼(982332664) 21:21:10
报链接错误?
John Lee<j.y.lee@yeah.net> 21:21:52
对于外部对象是变量的符号冲突的情况,问题不能像处理函数那么简单,不同的链接器实现,有着不同处理策略。
道可道(549040622) 21:22:01
报某个定义在两个.o中都有
xieguanhui<w.b.zhang1214@163.com> 21:23:35
提个问题,此章课程目标(目的)是什么?
John Lee<j.y.lee@yeah.net> 21:24:31
除了外部对象之外,目标模块中还可能包括了对其他模块中的外部对象的引用。
雁塔菜农<hotwc3@qq.com> 21:25:24
老师,该课间提问了。
(来自手机QQ2012 [iPhone]: http://mobile.qq.com )
风雨无阻(1062514568) 21:25:33

John Lee<j.y.lee@yeah.net> 21:25:41
例如,一个调用了printf()的源程序所生成的.o模块,就包括了一个对printf的引用。
转战ZigBee(772880135) 21:25:44

转战ZigBee(772880135) 21:26:15
抢答时间来了。 有什么奖品

雪狼(982332664) 21:26:16
请问下那些局部变量如何处置了?
雁塔菜农<hotwc3@qq.com> 21:27:07
答对的在https://bbs.21ic.com/icview-323829-1-1.html报名
转战ZigBee(772880135) 21:27:10
只是一个名称代号吧。重要的是内存分配。
雁塔菜农<hotwc3@qq.com> 21:27:39
奖品25元
雁塔菜农<hotwc3@qq.com> 21:28:03
答错了就没有
klusday(313536317) 21:28:43
问题啥哦
雁塔菜农<hotwc3@qq.com> 21:29:08
老师提问呀
雪狼(982332664) 21:29:19
时间过的好快
M0菜地<murex@126.com> 21:29:37

klusday(313536317) 21:29:26
哦,呵呵
John Lee<j.y.lee@yeah.net> 21:29:51
稍等,有一段好像有些问题。
丶砖家(1361439207) 21:30:08
PB14脚 外部中断0 低电平触发中断 结果按下按键 过了半天才进入中断服务函数 请问怎么回事啊?
John Lee<j.y.lee@yeah.net> 21:30:57
大家休息一下,我想想提什么问。
丶砖家(1361439207) 21:31:24
PB14脚 外部中断0 低电平触发中断 结果按下按键 过了半天才进入中断服务函数 请问怎么回事啊?LEE老师帮我解答一下
丶砖家(1361439207) 21:31:25
谢谢
转战ZigBee(772880135) 21:31:15

转战ZigBee(772880135) 21:31:47
你用下降沿触发中断吧。
丶砖家(1361439207) 21:32:00
外部中断0相关函数:DrvGPIO_InitFunction(E_FUNC_EXTINT0);//初始化指定功能,配置PB.14为外部中断0
        DrvGPIO_EnableEINT0(E_IO_FALLING,E_MODE_EDGE,EINT0Callback);//[使能外部中断0]中断触发类型:下降沿/低电平 中断模式:边沿触发 回调函数的指针:EINT0Callback
        DrvGPIO_EnableDebounce(E_GPB,14);//使能GPIO_B.14脚去抖动功能
        DrvGPIO_SetDebounceTime(4,E_DBCLKSRC_10K);//(基于去抖计数器时钟源设定中断去抖采样时间) 去抖动时间:(2^10)*(10*1000)s=128*0.0001=12800us
        DrvGPIO_EnableInt(E_GPB,14,E_IO_FALLING,E_MODE_EDGE);
潜龙思瑞(373744463) 21:32:08
你用了片内低速晶振了吧
转战ZigBee(772880135) 21:32:09

丶砖家(1361439207) 21:32:24
是啊 我用内部10K
雪狼(982332664) 21:31:56

潜龙思瑞(373744463) 21:32:37
那就结了
丶砖家(1361439207) 21:32:43
你的意思是去抖动的时间问题??
道可道(549040622) 21:33:30
好像外部中断无法消抖动
丶砖家(1361439207) 21:33:51
晕 难道是我数据手册看错了
丶砖家(1361439207) 21:34:22

道可道(549040622) 21:34:36
手册上没说。。。我试过一次,好像不可以,按一下就加好多次
道可道(549040622) 21:34:55
IO中断可以
KiraVerSace<kiraversace@qq.com> 21:35:04
搞个施密特触发器
道可道(549040622) 21:35:05
外部中断貌似不可以

使用特权

评论回复
板凳
searover79|  楼主 | 2012-4-6 22:55 | 只看该作者
John Lee<j.y.lee@yeah.net> 21:35:09
嗯,考一个比较偏的问题吧,呵呵,我们通常说的“编译列表”文件(MDK是.txt,GCC是.lst)是由工具链的哪个工具生成的?
1) 编译器,2)汇编器,3)链接器
潜龙思瑞(373744463) 21:35:31
3)
潜龙思瑞(373744463) 21:35:38
链接器
雪狼(982332664) 21:35:56
3)链接器
策马西风(577141997) 21:35:56
2
转战ZigBee(772880135) 21:36:12
2  
M0菜地<murex@126.com> 21:36:36
1
转战ZigBee(772880135) 21:36:20

klusday(313536317) 21:36:23
猜了的,讲原理。
M0菜地<murex@126.com> 21:36:40

道可道(549040622) 21:36:42
就是就是。。。
klusday(313536317) 21:37:01
讲不出来的没得奖
雁塔菜农<hotwc3@qq.com> 21:37:35
晕,123
klusday(313536317) 21:38:01
农哥V5,我的123
转战ZigBee(772880135) 21:37:59
  全选?
klusday(313536317) 21:38:03
多选
klusday(313536317) 21:38:08
你就不能算了
M0菜地<murex@126.com> 21:38:27

雪狼(982332664) 21:38:10
单选?
雁塔菜农<hotwc3@qq.com> 21:38:12
总有一个对的
道可道(549040622) 21:38:23
应该是汇编
klusday(313536317) 21:38:27
是多选同志们
xieguanhui<w.b.zhang1214@163.com> 21:38:33
1) 编译器
丶砖家(1361439207) 21:38:45
123
searover79(2239458777) 21:38:55
1) 编译器
转战ZigBee(772880135) 21:38:59
lee 老师解答
xieguanhui<w.b.zhang1214@163.com> 21:39:01
“编译列表”文件是由编译器生成的
雪狼(982332664) 21:39:09
先经过编译器编译成.S的文件,
道可道(549040622) 21:39:14
可以用记事本打开
John Lee<j.y.lee@yeah.net> 21:39:26
这个是整个工具链的big picture:

雪狼(982332664) 21:39:33
再经过汇编器编译成.O的文件
雁塔菜农<hotwc3@qq.com> 21:39:38
应该自己解答为什么
道可道(549040622) 21:39:53
.o的打不开
M0菜地<murex@126.com> 21:40:18
那么说是2了
转战ZigBee(772880135) 21:40:03
汇编器
雪狼(982332664) 21:40:21
链接器链接.O的文件,生成目标文件
道可道(549040622) 21:40:31
所以猜测汇编器
转战ZigBee(772880135) 21:40:52
只能算一个抢答的?
xieguanhui<w.b.zhang1214@163.com> 21:40:54
**是1) 编译器
M0菜地<murex@126.com> 21:41:17

转战ZigBee(772880135) 21:41:16

searover79(2239458777) 21:41:23

雪狼(982332664) 21:41:49
打字慢了
雪狼(982332664) 21:41:56

xieguanhui<w.b.zhang1214@163.com> 21:41:51
这才叫列表
M0菜地<murex@126.com> 21:42:32
我是看着都选了,就差1么就先选个了,哈
道可道(549040622) 21:42:33
.obj是目标文件
道可道(549040622) 21:42:43

转战ZigBee(772880135) 21:42:52
老师说的“列表” 是  .lst和.TXT 格式。
John Lee<j.y.lee@yeah.net> 21:42:55
编译器生成的是.s文件,而列表文件中包含了汇编后的结果,所以,应该是assembler。
xieguanhui<w.b.zhang1214@163.com> 21:43:15

M0菜地<murex@126.com> 21:43:40
这位同学回答对了
转战ZigBee(772880135) 21:43:27
  
M0菜地<murex@126.com> 21:43:57
是第一个抢答对的
xieguanhui<w.b.zhang1214@163.com> 21:43:40
理解错了,继续努力。。。。
策马西风(577141997) 21:44:01
我猜的,三被选走了所以选了2
John Lee<j.y.lee@yeah.net> 21:44:08
其实列表文件(.lst)和汇编文件(.s)的区别不大。
策马西风(577141997) 21:44:18

M0菜地<murex@126.com> 21:44:52
嗯,基本都差不多内容的
转战ZigBee(772880135) 21:44:37
哦。
道可道(549040622) 21:44:52
微机原理做过这个实验
John Lee<j.y.lee@yeah.net> 21:44:56
如果不需要看汇编后的结果,那么完全可以看.s就可以了。
转战ZigBee(772880135) 21:45:23
好吧,我先撤了。
雁塔菜农<hotwc3@qq.com> 21:45:34
老师有结果了?
M0菜地<murex@126.com> 21:46:03
就是汇编器了
雁塔菜农<hotwc3@qq.com> 21:46:27
https://bbs.21ic.com/icview-323829-1-1.html
雁塔菜农<hotwc3@qq.com> 21:46:54
到比报名
雁塔菜农<hotwc3@qq.com> 21:47:04
到此
xieguanhui<w.b.zhang1214@163.com> 21:47:13
发个列表文件来看看,加深一下认识
转战ZigBee(772880135) 21:47:25
菜农 我能不能问你那买书
John Lee<j.y.lee@yeah.net> 21:47:58
下面的语句:
int a;
如果其位置出现在所有的函数体之外,那么它就称为外部对象 a 的定义。
雁塔菜农<hotwc3@qq.com> 21:48:11
不知他21ic网名
雪狼(982332664) 21:48:15

John Lee<j.y.lee@yeah.net> 21:48:39
这个语句说明了 a 是一个外部整形变量,同时为 a 分配了存储空间。
雁塔菜农<hotwc3@qq.com> 21:49:11
俺不卖
M0菜地<murex@126.com> 21:49:38

M0菜地<murex@126.com> 21:50:00
看这上面说的 .lst文件是有三种会生成的
John Lee<j.y.lee@yeah.net> 21:49:42
因为外部对象 a 并没有指定初始值,所以它的初始值默认为 0。
M0菜地<murex@126.com> 21:50:13
应该说是两种
M0菜地<murex@126.com> 21:50:34
是不是老师
John Lee<j.y.lee@yeah.net> 21:53:59
菜地,你看的是哪个编译器?
潜龙思瑞(373744463) 21:54:16
应是MDK
M0菜地<murex@126.com> 21:55:01
C51的,哈
M0菜地<murex@126.com> 21:55:17

John Lee<j.y.lee@yeah.net> 21:55:07
呵呵,c51就不说了。
雪狼(982332664) 21:55:09
keil
M0菜地<murex@126.com> 21:55:41
老师眼光果然犀利,一下就看出来了
John Lee<j.y.lee@yeah.net> 21:55:32

M0菜地<murex@126.com> 21:56:25

John Lee<j.y.lee@yeah.net> 21:57:09
关于这个.txt,可以看到这里有汇编代码,应该是汇编器的输出:

风雨无阻(1062514568) 21:58:12
好多都听不懂
John Lee<j.y.lee@yeah.net> 21:58:32
但文件头上,又有些古怪:

M0菜地<murex@126.com> 21:59:20
上面说的是编译器
John Lee<j.y.lee@yeah.net> 21:59:49
估计应该是.s文件中的内容,汇编器照抄过来的,输出到了列表文件.txt中。
M0菜地<murex@126.com> 22:00:36
有可能
John Lee<j.y.lee@yeah.net> 22:00:33
你可以试试编译输出汇编文件,看看就知道结果了。
潜龙思瑞(373744463) 22:00:35
那.s是编译器输出的吧
xieguanhui<w.b.zhang1214@163.com> 22:00:54
Lee老师,我们了解这个有什么好处吗??
潜龙思瑞(373744463) 22:01:22
我看应选1和2
John Lee<j.y.lee@yeah.net> 22:02:12
但GNU工具链生成的列表文件.lst,这是这样的:

John Lee<j.y.lee@yeah.net> 22:02:36
第一行就是 ARM GAS,很明确,是assembler输出的。
M0菜地<murex@126.com> 22:03:13

丶砖家(1361439207) 22:03:01
DrvGPIO_Open(E_GPB,14, E_IO_OUTPUT);PB14脚设置输出模式 也能触发中断?
丶砖家(1361439207) 22:03:06
怎么搞的?
John Lee<j.y.lee@yeah.net> 22:04:10
从逻辑上也可以想到,.s文件和列表文件(.txt, .lst)的区别不大,编译器既然输出了.s文件,没有必要再输出列表文件吧。
潜龙思瑞(373744463) 22:04:25

潜龙思瑞(373744463) 22:05:07
如果我选第二栏打上,第一栏空,不也可生成么?
潜龙思瑞(373744463) 22:05:51
再说下边链接器也有.lst???
John Lee<j.y.lee@yeah.net> 22:06:18
第1栏,是指你自己写的.s文件,而不是编译器输出的。
潜龙思瑞(373744463) 22:07:06
但是 LISTING:
潜龙思瑞(373744463) 22:07:17
就是指列表的意思
John Lee<j.y.lee@yeah.net> 22:07:18
linker listing,看清楚,是map
潜龙思瑞(373744463) 22:07:38

潜龙思瑞(373744463) 22:08:01
那第二栏应是列表的意思对吧
John Lee<j.y.lee@yeah.net> 22:08:13
是的。
潜龙思瑞(373744463) 22:08:58
那就是说编译器列出。TXT,而汇编为。LST
John Lee<j.y.lee@yeah.net> 22:09:14
那是概念上的问题,我们平常说的编译输出列表文件,实际的处理是汇编器生成的。
John Lee<j.y.lee@yeah.net> 22:09:55
而说的编译输出.o文件,都隐含了汇编这个过程。
John Lee<j.y.lee@yeah.net> 22:15:12
OK,再次证实了,刚才的.txt文件头的内容,就是.s文件带过来的。
John Lee<j.y.lee@yeah.net> 22:15:33
这个是.s文件
John Lee<j.y.lee@yeah.net> 22:15:27

John Lee<j.y.lee@yeah.net> 22:15:48

寒雨(251539157) 22:15:58
哦   
John Lee<j.y.lee@yeah.net> 22:16:14
这个是.txt文件,看看,是不是明白了。
M0菜地<murex@126.com> 22:17:00

John Lee<j.y.lee@yeah.net> 22:17:18
所以啊,有些概念也是很表面化的,大家平时都没有去深究。
John Lee<j.y.lee@yeah.net> 22:17:47
深究起来,这些概念,其实都不严谨。
M0菜地<murex@126.com> 22:18:22

寒雨(251539157) 22:18:11
这么说几乎每个编译器都包晗了汇编器,可以这么理解吗?   
寒雨(251539157) 22:18:19
李老师   
John Lee<j.y.lee@yeah.net> 22:18:17

John Lee<j.y.lee@yeah.net> 22:18:31
都是的。
寒雨(251539157) 22:18:49
嗯   
John Lee<j.y.lee@yeah.net> 22:19:14
当然,也有某些工具链的编译器内部就含有汇编器的功能,可以直接输出.o文件。
John Lee<j.y.lee@yeah.net> 22:19:45
我记得以前的borland c,好像就是这样的。
John Lee<j.y.lee@yeah.net> 22:20:33
了解这些内容,对某些错误的排查,是很有帮助的。
M0菜地<murex@126.com> 22:21:53
特别是有些警告,又没法直接定位的,比较难找原因
寒雨(251539157) 22:21:46
怪不得,有些错误老是找不出,编译虽通过了   
寒雨(251539157) 22:22:16
但是达不到想要的效果   
John Lee<j.y.lee@yeah.net> 22:22:25
当你的程序设计经验到了比较高的时候,可能会使用一些特殊的高级编程技巧,这个过程中保不准就可能出现一些看起来很古怪的错误。
John Lee<j.y.lee@yeah.net> 22:23:56
如果你掌握了工具链的相关知识,就可以顺着工具链的各个环节来排查错误。
John Lee<j.y.lee@yeah.net> 22:25:25
今天就讲到这里吧。
XiaomaGee(15959622) 22:25:56

策马西风(577141997) 22:26:00
谢谢老师
/tyBryan(272650089) 22:26:03
老师再见
searover79(2239458777) 22:26:07
谢谢李老师
M0菜地<murex@126.com> 22:26:30
谢谢老师
xieguanhui<w.b.zhang1214@163.com> 22:26:12

潜龙思瑞(373744463) 22:26:19

寒雨(251539157) 22:26:28
老师再见   
John Lee<j.y.lee@yeah.net> 22:26:41
链接器经常遇到的报错有,符号多次定义,段覆盖等等。
John Lee<j.y.lee@yeah.net> 22:27:42
好像今天还有人在大群里问一个错误的原因,看他的贴图,就是链接器报错。
John Lee<j.y.lee@yeah.net> 22:29:15

找到了,是“电子white_cai(772880135) 16:53:58 ”的问题:

使用特权

评论回复
地板
hotpower| | 2012-4-7 14:44 | 只看该作者
做的很不错!

使用特权

评论回复
5
xyz549040622| | 2012-4-7 17:56 | 只看该作者
顶!

使用特权

评论回复
6
[惊涛骇浪]| | 2012-4-7 19:41 | 只看该作者
顶一个

使用特权

评论回复
7
caoqing1314| | 2012-4-7 19:48 | 只看该作者
:victory:

使用特权

评论回复
8
lixiaoxu2meng| | 2012-4-8 08:12 | 只看该作者

使用特权

评论回复
9
zuoanhuafeng| | 2012-4-8 19:29 | 只看该作者
大家好
:'(

使用特权

评论回复
10
plc_avr| | 2012-4-9 07:26 | 只看该作者
顶起,没空听课,下群课笔记来看。谢谢上传。

使用特权

评论回复
11
[惊涛骇浪]| | 2012-4-9 09:22 | 只看该作者
顶起来

使用特权

评论回复
12
Swallow_0322| | 2012-4-9 13:32 | 只看该作者
顶!

使用特权

评论回复
13
abin0415| | 2012-4-11 16:21 | 只看该作者
这。。。必须顶

使用特权

评论回复
14
416775364TP| | 2012-11-2 23:41 | 只看该作者
顶,对编译器,汇编器,连接器有了了解,对.lst .S .obj .txt更清晰。编译器里面汇编器(borlandC)。编译通过,连接不一定就行。连接是代码定位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

301

帖子

0

粉丝