首页
社区
课程
招聘
[原创]学习笔记一(入门篇)程序的链接和加载
发表于: 2009-4-20 22:43 3870

[原创]学习笔记一(入门篇)程序的链接和加载

2009-4-20 22:43
3870
本人老菜鸟一个。。老是说的年龄,而非水平。菜鸟则说的是我水平,平时工作实在太忙。。好了。言归正传,要研究一个程序,那想来就该研究这个程序是咋跑的。。于是网上去翻了篇文章linker and loader.pdf
网址是linker.iecc.com,似乎是挺老挺经典的文章。。如果不想看E文,就去查lnl_cn_beta2.pdf  ,这个是中文版。。好了。下面是我看后个人归纳整理的正文,如果错误还请指教。。就像那文章里写的。各位看官的意见都是正确。错误都是本人造成的。

首先要理解的是程序的链接,嘿嘿。这个东西好像不是特重要。。本菜鸟看得也不是特别仔细。
不过今天这么晚了。。估计加载得等到明天仔细看了。。(不过明天貌似要加班。。555,顺延再说吧)。首先准备2个文件a.cpp 内容如下
#include <stdio.h>
extern void b();
void main()
{
        printf("this is a\n");
        b();
}
然后是b.cpp
#include <stdio.h>
void b()
{
        printf("this is b\n");
}
嘿嘿,开发环境就先用VS 2005吧。。LINUX下次试验。RELEASE编译得到a.obj 和b.obj  和a.exe,这3个东西。。所谓的链接,应该就是把a.obj + b.obj搞成一个a.exe吧。。至于a.obj和b.obj是咋生成的???这个好像是编译原理的事。估计就是词法分析,语法分析的事情了。。这个暂时先不管了。先要研究的还是a.obj是个啥东西。。OBJ似乎是个COFF的文件结构。
自上而下分别为:
  1. 文件头(File Header)
  2. 可选头(Optional Header)
  3. 段落头(Section Header)
  4. 段落数据(Section Data)
  5. 重定位表(Relocation Directives)
  6. 行号表(Line Numbers)
  7. 符号表(Symbol Table)
  8. 字符串表(String Table)
这东西光这么看着。。俺不理解啊!!没办法。。敲代码吧。。。使用VS2005。再次生成个工程。。这次就是不空工程了。带上MFC吧。。奇怪
typedef struct
{
        unsigned short Machine; // 目标机器类型
        unsigned short NumberOfSections; // 段落(Section)数
        unsigned long ulTime; // 时间戳
        unsigned long ulSymbolOffset; // 符号表偏移
        unsigned long ulNumSymbol; // 符号数
        unsigned short usOptHdrSZ; // 可选头长度
        unsigned short usFlags; // 文件标记
} FILEHDR;
读取文件头
                CFile myfile(_T("E:\\软件安全学习\\test1\\test1\\test1\\Release\\b.obj"),CFile::shareDenyWrite);
                FILEHDR filehead;
        //        myfile.Seek(6,CFile::current);
                myfile.Read(&filehead,sizeof(filehead));
奇怪filehead的内容似乎与文档不太一致。。难道微软VS2005生成的OBJ文件不符合pecoff_v81规范???明天再研究下
a.OBJ的文件头怎么是
00000000h: 00 00 FF FF 01 00 4C 01 30 7B EC 49 38 FE B3 0C ; ....L.0{霫8.
00000010h: A5 D9 AB 4D AC 9B D6 B6 22 26 53 C2 9B 22 00    ; ベ玀瑳侄"&S聸".

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
郁闷。。刚刚查资料  VS2005生成的OBJ只有DEBUG是符合COFF规范,。。RELEASE版本居然不符合COFF规范!!!!!!!!!!  郁闷。。哪位高人知道这是啥格式??
2009-4-22 19:37
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
自己感觉边看边做笔记的效果不好。。。所以估计笔记更新的时间会稍慢。。等我看完加载再写笔记
2009-4-23 12:22
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
顶一下 学习,
楼主让开眼界了!
2009-4-23 13:03
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
这部分知识很基础,对于理解二进制程序文件的结构却是非常重要的。

支持楼主继续发文。
2009-4-23 13:47
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
基础的东西看起来舒服,笔记更新的时间确实太稍慢了。
2009-5-3 12:22
0
游客
登录 | 注册 方可回帖
返回
//