文章目录一、Windows 平台DLL → .lib 导入Stub库场景1有 DLL 源码编译时自动生成场景2只有 DLL 二进制无源码逆向生成Stub二、Linux 平台.so → .a Stub导入库场景1有 .so 源码编译时同步生成场景2只有 .so 二进制无源码生成Stub方法1用 objcopy 提取符号表最简单方法2用 gendef dlltool 生成跨平台兼容三、跨平台自动化方案1. 通用工具implib-gen2. CMake 自动生成Stub库四、Stub库使用说明动态库的Stub桩/导入库是仅包含符号信息、不包含实际实现的轻量库用于链接阶段解析符号运行时会自动加载真实的动态库.so/.dll。不同平台生成方式差异较大以下是分平台的完整方案一、Windows 平台DLL → .lib 导入Stub库Windows 下链接 DLL 必须依赖对应的.lib导入库Stub库分两种场景场景1有 DLL 源码编译时自动生成使用 MSVC 编译 DLL 时只要通过__declspec(dllexport)导出符号编译器会自动生成对应的 .lib Stub库// 头文件中声明导出__declspec(dllexport)intadd(inta,intb);编译命令MSVCcl /LD your_code.c /Fe:your.dll# 编译完成后会同时生成 your.dll 和 your.libStub导入库场景2只有 DLL 二进制无源码逆向生成Stub如果只有现成的 DLL、没有源码通过以下三步逆向生成.libStub库导出 DLL 的符号表用 Visual Studio 自带的dumpbin工具导出所有导出函数dumpbin /EXPORTS your.dllexports.txt生成 DEF 模块定义文件编辑exports.txt整理为标准 DEF 格式LIBRARY your.dll # 对应DLL文件名 EXPORTS add 1 # 函数名 序号从dumpbin结果中提取 sub 2 mul 3用 lib.exe 生成 Stub库在 Visual Studio 命令行工具中执行lib /def:your.def /out:your.lib /machine:x64# /machine 可选 x64 / x86 / ARM64和DLL架构一致二、Linux 平台.so → .a Stub导入库Linux 本身支持直接链接.so动态库Stub库主要用于闭源发布只给用户Stub库用于链接运行时才提供.so分两种场景场景1有 .so 源码编译时同步生成编译.so时通过链接器参数直接同步生成 Stub库gcc-shared-fPIC-olibyour.so your_code.c\-Wl,--out-implib,libyour_stub.a# 编译完成后会同时生成 libyour.so 和 libyour_stub.aStub库场景2只有 .so 二进制无源码生成Stub方法1用 objcopy 提取符号表最简单直接从 .so 中提取符号和调试信息生成Stub库objcopy --only-keep-debug libyour.so libyour_stub.a生成的libyour_stub.a仅包含符号表链接时可正常解析所有函数运行时会自动加载真实的libyour.so。方法2用 gendef dlltool 生成跨平台兼容适合需要和 Windows 流程对齐的场景# 1. 安装工具Debian/Ubuntusudoaptinstallmingw-w64-tools# 2. 从.so生成DEF文件gendef libyour.so# 3. 生成Stub静态库dlltool-dlibyour.def-llibyour_stub.a-k三、跨平台自动化方案1. 通用工具implib-gen开源跨平台导入库生成工具支持 Windows/Linux/macOS# 安装gitclone https://github.com/eliben/implib-gencdimplib-genmake# 生成Stub库./implib-gen libyour.so# Linux./implib-gen your.dll# Windows2. CMake 自动生成Stub库在 CMake 中配置自动同步生成Stub库add_library(your SHARED your_code.c) # Linux 生成Stub库 if(UNIX) target_link_options(your PRIVATE -Wl,--out-implib,${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}_stub.a ) endif() # Windows 自动生成.libCMake默认行为无需额外配置四、Stub库使用说明链接阶段编译你的程序时链接 Stub库.lib/.a编译器会自动记录动态库依赖运行阶段程序启动时会自动加载真实的动态库.so/.dllStub库不需要随程序发布兼容性Stub库必须和动态库的架构、导出符号完全一致否则会链接失败
如何生成动态库的Stub导入库(桩库)
文章目录一、Windows 平台DLL → .lib 导入Stub库场景1有 DLL 源码编译时自动生成场景2只有 DLL 二进制无源码逆向生成Stub二、Linux 平台.so → .a Stub导入库场景1有 .so 源码编译时同步生成场景2只有 .so 二进制无源码生成Stub方法1用 objcopy 提取符号表最简单方法2用 gendef dlltool 生成跨平台兼容三、跨平台自动化方案1. 通用工具implib-gen2. CMake 自动生成Stub库四、Stub库使用说明动态库的Stub桩/导入库是仅包含符号信息、不包含实际实现的轻量库用于链接阶段解析符号运行时会自动加载真实的动态库.so/.dll。不同平台生成方式差异较大以下是分平台的完整方案一、Windows 平台DLL → .lib 导入Stub库Windows 下链接 DLL 必须依赖对应的.lib导入库Stub库分两种场景场景1有 DLL 源码编译时自动生成使用 MSVC 编译 DLL 时只要通过__declspec(dllexport)导出符号编译器会自动生成对应的 .lib Stub库// 头文件中声明导出__declspec(dllexport)intadd(inta,intb);编译命令MSVCcl /LD your_code.c /Fe:your.dll# 编译完成后会同时生成 your.dll 和 your.libStub导入库场景2只有 DLL 二进制无源码逆向生成Stub如果只有现成的 DLL、没有源码通过以下三步逆向生成.libStub库导出 DLL 的符号表用 Visual Studio 自带的dumpbin工具导出所有导出函数dumpbin /EXPORTS your.dllexports.txt生成 DEF 模块定义文件编辑exports.txt整理为标准 DEF 格式LIBRARY your.dll # 对应DLL文件名 EXPORTS add 1 # 函数名 序号从dumpbin结果中提取 sub 2 mul 3用 lib.exe 生成 Stub库在 Visual Studio 命令行工具中执行lib /def:your.def /out:your.lib /machine:x64# /machine 可选 x64 / x86 / ARM64和DLL架构一致二、Linux 平台.so → .a Stub导入库Linux 本身支持直接链接.so动态库Stub库主要用于闭源发布只给用户Stub库用于链接运行时才提供.so分两种场景场景1有 .so 源码编译时同步生成编译.so时通过链接器参数直接同步生成 Stub库gcc-shared-fPIC-olibyour.so your_code.c\-Wl,--out-implib,libyour_stub.a# 编译完成后会同时生成 libyour.so 和 libyour_stub.aStub库场景2只有 .so 二进制无源码生成Stub方法1用 objcopy 提取符号表最简单直接从 .so 中提取符号和调试信息生成Stub库objcopy --only-keep-debug libyour.so libyour_stub.a生成的libyour_stub.a仅包含符号表链接时可正常解析所有函数运行时会自动加载真实的libyour.so。方法2用 gendef dlltool 生成跨平台兼容适合需要和 Windows 流程对齐的场景# 1. 安装工具Debian/Ubuntusudoaptinstallmingw-w64-tools# 2. 从.so生成DEF文件gendef libyour.so# 3. 生成Stub静态库dlltool-dlibyour.def-llibyour_stub.a-k三、跨平台自动化方案1. 通用工具implib-gen开源跨平台导入库生成工具支持 Windows/Linux/macOS# 安装gitclone https://github.com/eliben/implib-gencdimplib-genmake# 生成Stub库./implib-gen libyour.so# Linux./implib-gen your.dll# Windows2. CMake 自动生成Stub库在 CMake 中配置自动同步生成Stub库add_library(your SHARED your_code.c) # Linux 生成Stub库 if(UNIX) target_link_options(your PRIVATE -Wl,--out-implib,${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}_stub.a ) endif() # Windows 自动生成.libCMake默认行为无需额外配置四、Stub库使用说明链接阶段编译你的程序时链接 Stub库.lib/.a编译器会自动记录动态库依赖运行阶段程序启动时会自动加载真实的动态库.so/.dllStub库不需要随程序发布兼容性Stub库必须和动态库的架构、导出符号完全一致否则会链接失败