dumpbin
- VCVARS32.bat 文件用于设置环境变量
- 或者直接从开始菜单中找到运行VS的tools
- 常用选项:/ALL /DISASM /EXPORTS /DEPENDENTS /HEADERS /IMPORTS
- 详见收藏夹
C++静态库与动态库
- 《程序员的自我修养——链接、装载与库》深入底层学习用
- 静态库(.a、.lib)和动态库(.so、.dll)
- 静态库使用ar/lib.exe 打包.o文件产生
-
在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。
-
Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。
-
-fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。
1) 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统动态载入器(dynamic linker/loader)。
2) 对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib 目录找到库文件后将其载入内存。
如何让系统能够找到它:
- 如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。
- 如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下:
-- 编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
-- 运行ldconfig ,该命令会重建/etc/ld.so.cache文件
- C++的name mangling 名称倾轧 extern “C”
- 详见:https://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.html
#pragma para
- 设定编译器的状态或者是指示编译器完成一些特定的动作
- #pragma comment( comment-type [,“commentstring”] )
- comment-type : compiler,exestr,lib,linker之一
- #pragma para
- para 常用参数:message() code_seg() once hdrstop comment
- 详见:https://www.cnblogs.com/forlina/archive/2011/08/11/2134961.html
__declspec(extended-decl-modifier-seq)
- align(#) 数据对齐
- allocate(“segname”)
- 详见:https://www.cnblogs.com/ylhome/archive/2010/07/10/1774770.html