Hen*_*rik -3 c linux windows dll assembly
作为Linux上的新手我有一些问题:
如何从程序加载C运行时?
路径和文件名是什么?
在Windows上它是
C:\Windows\System32\msvcrt.dll
Run Code Online (Sandbox Code Playgroud)
顺便问一下,Linux上调用的DLL是什么?
什么是对应MS的功能LoadLibrary和GetProcAddress?
它们驻留在什么DLL中?
我必须链接哪个库才能访问它们?
在Windows下它是kernel32.lib和kernel32.dll.
最后:如何独立于目标平台编写Masm/JWasm代码?
是否有反映命令行上使用的目标arg的汇编符号?
编辑:我忘了问几个问题:Linux是64位还是32位?它是否使用与64位MS C相同的调用约定?我的意思是rcx,rdx,r8,r9等参数.
典型的类UNIX系统将ELF文件格式用于目标文件,共享库和二进制文件.许多东西与Windows类似,但有些是不同的.首先,这是一个常用后缀列表:
UNIX Windows
*.o *.obj object file
*.a *.lib static library
*.so *.dll shared object (ELF targets)
*.dylib *.dll shared object (Mach O targets, i.e. Mac OS X)
* *.exe binary (no suffix on UNIX)
Run Code Online (Sandbox Code Playgroud)
静态链接的工作方式与Windows大致相同,但动态链接不同.首先,共享库没有lib文件.相反,静态链接器ld为您希望直接调用共享对象时调用的每个函数生成一个适当的PLT(过程链接表)和存根.在此使用方案中,您链接到的共享对象存储在二进制文件的特殊部分中.您的二进制文件不是直接执行的,而是将动态加载程序ld.so作为二进制文件的解释器加载,查找所有需要的共享对象并将它们加载到地址空间中.符号引用在第一次调用时解析(除非您另行指定).
也可以使用负载在运行时共享对象dl,其提供的功能库dlopen,dlclose,dlsym,和dlerror加载在他们共享对象和访问的符号.请注意,dl库可能取决于可用的libc部分,因为所有系统调用都是通过libc完成的.在某些类UNIX操作系统上,libdl已集成到libc中.
您当然也可以手动加载共享对象,但这样做很复杂.
没有直接相当于微软的kernel32.dll.系统调用在C标准库中实现libc.so(也可以静态使用libc.a),但您也可以直接调用操作系统.装配系统调用接口的稳定性因操作系统而异,但libc接口是稳定的.我强烈建议您使用libc专门调用操作系统.
CRT包含libc和一些目标文件,当您通过C编译器链接时,这些目标文件链接到您的程序中.这些目标文件从堆栈中检索参数向量和ELF辅助向量,并调用libc.然后libc会打电话main给你.我强烈建议您始终链接通过C编译器并让您的汇编程序开始main.这允许更容易和便携的编程.
为了进一步阅读,我建议您阅读SysV ABI和ELF格式的文档.
如果你想使用libc,我建议你通过C编译器链接:
cc -o binary object1.o object2.o ... -llibrary1 -llibrary2 ...
Run Code Online (Sandbox Code Playgroud)
这也将CRT条目存根链接到您的程序中; 程序本身应该提供一个名为的全局符号main,它由libc在ABI的调用约定中调用(在i386上,cdecl用于所有函数,在amd64上使用SysV ABI调用约定).签名如下:
main(argc, argv, envp);
Run Code Online (Sandbox Code Playgroud)
其中argc是命令行参数的数量,argv是指向命令行参数的以null结尾的指针数组的指针,而envp是指向以null结尾的环境变量数组的指针(每个条目都有表单key=value.如果main返回, C运行时调用exit函数,返回值为main退出状态.注意exit刷新所有stdio缓冲区,这样你就不必这样做了.
您还可以使用以下-static选项创建静态二进制文件:
cc -static -o binary object1.o object2.o ... -llibrary1 -llibrary2 ...
Run Code Online (Sandbox Code Playgroud)
请注意,某些libc功能(例如DNS查找)需要动态加载共享库,如果您使用这些功能中的任何一个,则在程序执行期间可能会打开共享库.
如果您不想使用libc,请将程序链接ld到链接器:
ld -o binary object1.o ... -llibrary1 ...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,程序的入口点是一个名为的全局符号_start,操作系统在启动时将大量有用的东西放在堆栈上,阅读上述ABI文档以获取详细信息.
stdin,, stdout和stderr分别作为文件描述符0,1和2提供.不保证它们是开放的.您可以使用标准POSIX函数read()以及write()从中读取和写入数据.访问指针到C FILE结构stdin,stdout以及stderr取决于你的操作系统方案上.在Linux上,这些只是外部符号,但在其他系统(例如FreeBSD)上,您可能需要调用函数来获取指针.
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |