-_-程序运行的底层…………

Paradin 2007-11-18 10:47:56
例如 编译几个文件 cl main.c utility.obj .........
我想知道哪些库函数的指令(比如fprintf)是在连接的时候就被组织到了目标程序中,这些连接库是否被称为静态链接库?后缀名是否为 .a? .lib? .o? 有何区别. 而哪一些是在程序运行的时候才去动态地调用,是否叫做动态链接?后缀名.dll? ....obj 的文件结构是怎样的?
其他操作系统下是否类似呢?

谢谢可敬的大牛们!
...全文
198 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanfengthinker 2007-11-23
  • 打赏
  • 举报
回复
小鸟也想好好学学这东东
可学不进去呀
加油中
yuanchuang 2007-11-21
  • 打赏
  • 举报
回复
后缀名只是一种文件类型的映射,表达同一个意思,被我忽悠了也比被后缀名忽悠了好啊,呵呵
mathe 2007-11-20
  • 打赏
  • 举报
回复
.a,.o,.so都是Linux下面的用法
.a指静态链接库(对应Windows下.lib)
.o是指目标文件(对应Windows下.obj)
.so是动态链接库(对应Windows下.dll)
mathe 2007-11-20
  • 打赏
  • 举报
回复
现在操作系统提供的函数通常都是动态链接,很少使用静态链接(当然你可以通过编译选项强行要求静态链接,这样通常产生的代码会更加大).
其他操作系统比如Linux也完全类似,只是那里动态链接库文件名后缀是.so而不是.dll
jixingzhong 2007-11-20
  • 打赏
  • 举报
回复
.dll文件,是为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中dll文件中常函数功能即可。这种方式我们称之为动态链接(Dynamically Linked)。但有时为了程序调试方便或其它原因,我们不希望叫程序去调用dll文件的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本身拥有一份函数的副本【从.lib中复制出来】。这种方式我们称之为静态链接(Statically Linked)。
jixingzhong 2007-11-20
  • 打赏
  • 举报
回复
What's the format of an .OBJ file?

--------------------------------------------------------------------------------


Information about the base .OBJ format can be found in Intel's document
number #121748-001, {8086 Relocatable Object Module Formats} (not
verified).

Both Microsoft and Borland have extended the .OBJ format, as has IBM for
OS/2; and according to the MS-DOS encyclopedia, Microsoft doesn't
actually use all the listed formats.

Microsoft-specific .OBJ formats:

* A 45-page article can be found in the {MS-DOS Encyclopedia}, ISBN
1-55615-049-0, now out of print.

* "Microsoft Object Module Format (OMF)" Specification, 22 Nov 1991, was
published by the Microsoft Languages Group (not verified).

Borland-specific .OBJ formats:

* Open Architecture Handbook. The Borland Developer's Technical Guide,
1991, no ISBN. Chapter 2, "Object file contents", (pages 27-50) covers
the comment records sent to the object file by Borland C++ version 3.0
and other Borland compilers. The comment records mostly contain
information for the Borland debugger (not verified).

A "tutorial on the .OBJ format" comes with the VAL experimental linker,
downloadable as <ftp://garbo.uwasa.fi/pc/assembler/linker.zoo>.
jixingzhong 2007-11-20
  • 打赏
  • 举报
回复
VC的bin目录下有个叫dumpbin.exe,可以用来查看 obj 文件内容, 有兴趣就自己研究一下
Paradin 2007-11-20
  • 打赏
  • 举报
回复
up
VxD1 2007-11-18
  • 打赏
  • 举报
回复
库函数都是在链接时加入到目标程序中去的,源代码经过编译成为目标代码obj文件,此时文件中含有可执行代码和和一些待链接的信息供链接器使用以便能够链接为最终可执行程序。后缀为dll的文件是动态链接文件,比如windows目录下的那一堆,这些文件是程序执行时通过pe文件头,动态的加入到可执行程序的执行空间中,具体可参阅pe文件头。静态链接是被加入到程序代码中,而动态的只是运行时加入到程序内存空间中。
我啃 2007-11-18
  • 打赏
  • 举报
回复
windows下都是COFF(目标文件有调试信息) PE(执行文件镜像)
Paradin 2007-11-18
  • 打赏
  • 举报
回复
.lib 文件好像是一堆obj的集合
Paradin 2007-11-18
  • 打赏
  • 举报
回复
谢谢
正在学呵觉得有必要搞清楚虽然都是window特有但觉得一通百通
过段时间大家都有分
VxD1 2007-11-18
  • 打赏
  • 举报
回复
标准库函数它没必要每次链接前都编译一遍,所以是已经编译好的,直接链接上就可以了,win32 api就是动态加载的那种,程序运行时要动态加载哪些dll,具体要看你调用哪些函数了,每个dll里有许许多多相关的函数。具体可以参见windows程序设计下册的第17章(具体哪一章有点记不清了),如果想弄清楚点,学学汇编,然后看看pe文件头格式,比如《加密与解密》第二版里pe文件头那一章,受益匪浅的
xiao_dang 2007-11-18
  • 打赏
  • 举报
回复
API是操作系统提供的借口(函数)。Windows很特殊,是用DLL方式实现的。
系统库很多
NT系统下最底层的库是ntdll.dll,但是一般程序都只是间接引用这个库。
程序引用得多的一般是kernel32.dll,user32.dll,shell32.dll等。
ryfdizuo 2007-11-18
  • 打赏
  • 举报
回复
晕啊,最怕这些东东了....
^_^_ ^_^
Paradin 2007-11-18
  • 打赏
  • 举报
回复
是否标准库函数都已经有了目标代码连接时直接加入程序中,而winAPI函数就是需要动态地加载的那种?在哪些dll里呢?

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧