本人老菜鸟一个。。老是说的年龄,而非水平。菜鸟则说的是我水平,平时工作实在太忙。。好了。言归正传,要研究一个程序,那想来就该研究这个程序是咋跑的。。于是网上去翻了篇文章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直播授课