本系列教程对应的代码已开源在 Github zeedle本篇文章介绍如何打包所编写的音乐播放器!为什么要打包?...cargo-bundle,因为我用这个没有打包成功cargo install cargo-packager指定打包配置在Cargo.toml中添加:[package.metadata.packager]...[package.metadata.packager.nsis]installer-icon = "ui/cover.ico" # 指定安装包使用这个图标这里需要的.dll文件,在linux下可以用...ldd查找,在Windows下可以用dumpbin查找,dumpbin存在于Developer PowerShell for VS xxxx中,可以直接打开这个shell使用:dumpbin /dependents...xxx.exe进行打包cargo packager --release生成的文件将被存放到target/release目录下。
VISUAL C++ 编译器做法稍有不同,它把这种类型的段叫做“ COMDAT”,这种“ COMDAT”段的属性字段(PE文件的段表结构里面的 IMAGE SECTION HEADER的Characteristics...当我们须要用到某个目标文件中的任意一个函数或变量时,就须要把它整个地链接进来,也就是说那些没有用到的函数也被一起链接了进来。...当链接器须要用到某个函数时,它就将它合并到输出文件中,对于那些没有用的函数则将它们抛弃。这种做法可以很大程度上减小输出文件的长度,减少空间浪费。...C++与ABI 既然每个编译器都能将源代码编译成目标文件,那么有没有不冋编译器编译出来的目标文件是不能够相互链接的呢?...有没有可能将MSVC编详出来的目标文件和GCC编译出来的目标文件链接到一起,形成一个可执行文件呢?
,尽管对应的符号在代码中并没有实现。...检测object files archive extraction: .a成员只会在满足非archive object文件未定义符号之一的情况下才会被包含在最终的二进制文件中 链接时为了满足archive...undef以及require_define的符号所关联的文件进行mark,之后遍历所有alive的obj和dso,加入到root中,之后再进行mark_live_objects。...keep这里需要是undef的情况,我认为是因为如果esym存在定义,那么定义就是存在于当前的ObjectFile中,也就不需要再重复加入到root中了。...common我想同样是因为这种情况下所在的文件已经加入到root中了。
如何将二进制文件作为数据添加到自己程序中?...》 一种方法是将想二进制文件生成c代码,与项目一起编译,这方法对于小数据没问题,但如果二进制文件太大,生成的c代码更是巨大,增加编译器负担,好处就是完全没有跨平台问题。...objcopy本身就提供了二进制数据转成obj文件的能力 执行如下指令即可将 file.bin 生成 elf32-i386 格式的obj文件 file.o objcopy -I binary -O elf32...GNU objcopy的命令行工具可以直接将二进制文件转为obj文件.怎么办?...查看生成的obj文件,可以确认生成的是MSVC格式obj >dumpbin /symbols /headers fall_pe-x86-64.obj Microsoft (R) COFF/PE Dumper
有小伙伴告诉我一台设备全触摸失效了,但实际上是资源管理器未响应。通过本文可以了解到调试的思路和用到的工具 不要相信测试 测试小伙伴发现,在进行100次开机关机之后,可能会有触摸失效。...如果是全局钩子,那么也点不到任务管理器 所以上面的思路是不对的 实际问题 在任务管理器发现了资源管理器没有响应 也就是实际问题就是资源管理器没有响应,需要了解为什么资源管理器没有响应和可以如何解决 如果这个问题在网上问...,我需要关注一个第三方的应用未响应的只有堆栈和线程 因为老司机告诉我,如果一个程序未响应,在资源管理器看到 CPU 不动,那么原因就是程序在等待。...如果你继续往这条路走,如果失败了,请告诉我你使用的时间 安全模式 在不知道如何调试时,可以使用二分法,因为这是自主研发的设备,那么问题要么在微软的系统,要么在自主开发的软件,要么在自主研发的硬件。...那么这个文件和 mfc90u.dll 有什么联系,我将这个文件夹复制到我的电脑,通过 VisualStudio 的开发者命令行进入我的电脑复制到的文件夹,使用 dumpbin 工具找引用 dumpbin
如果你的项目使用 .NET Framework 框架,那么现行有很多简单的方法来帮你实现大内存感知,但 .NET Core 框架下却没有。...其他开启 LARGEADDRESSAWARE 的方法 不推荐的方法:仅适用于 .NET Framework 的旧方法 当时的那篇博客中,我提到过可通过编译成 AnyCPU (Prefer 32-bit)...方法是修改 csproj 文件,加上这两句: 1 2 3 4 5 ++ <!...检查是否已开启大内存感知 我在之前的博客中提到可以使用 Visual Studio 自带的 dumpbin 工具来检查是否开启了大内存感知: 1 dumpbin /headers xxx.exe | more...但是,我们有更直观的 dnSpy 为什么还要用命令行来临时查看呢?
comdat的消除出现不同的结果,原因是externally_visable变量在使用时还没有更新到预期的值,因此调整update_visibility_by_resolution_info中的检查函数来消除节点访问顺序造成的影响...二进制文件大小的优化编译得到的mmfinderrecommend_1117_O2_PUSE二进制文件大小为2.6G,尽管相对于最初的GCC10 O2+LTO的3.6G减小了1G,还是显得有点大,分析二进制文件的具体内容可以发现...debug信息占了将近90%的内容,binutils中的objcopy提供了一个压缩功能选项: objcopy --compress-debug-sections [xxx] [xxx.gz] 对二进制文件中的...DWARF块进行zlib压缩,可以再次大幅减小二进制文件到1.2G。...在视频号模块上我们成功的实现了版本升级适配以及20%的综合性能提升,优化后的二进制文件大小减少了80%,显著的改进了部署效率。
首先是解析输入,命令行参数解析的细节略过,但是这里不能略过elf文件的解析。我们从代码的实现去看elf的结构,再和文档中的图进行对比,同时尽可能从代码中去捋清不同结构之间的联系。...就是这些,但是注意,GitHub中mold项目下只存在elf文件的支持,mach的格式则是在sold这个项目中处理。...linker script mold的linker script根据解析的过程来看比较简单,没有在ld的脚本中的指定SECTION地址之类的内容,主要是对format以及符号version的一些控制。...| … | 关于GRP_COMDAT文档中也有提到 This is a COMDAT group....esym则是ElfSym的缩写,也就是Elf文件中的Symbol定义,而Symbol则是mold中自己定义的,相当于转换为自己想要的格式。
JNI 是一种标准的程序接口,用于编写 Java 本地方法,并且将 JVM 嵌入 Native 应用程序中。是为了给跨平台上的 JVM 实现本地方法库进行二进制兼容。...然而项目组目前也没有 JNI 的实践经验,最终性能是否能有提升,还是要打个问号。本着初生牛犊不怕虎的精神,我鼓起勇气主动认领了这个优化任务。...下编译在 windows 上运行,这是不可以的); JVM 位数和 lib 的位数不一致 (比如一个是 32 位,一个是 64 位); C++ 函数名写错; 生成的 lib 文件中并没有相对应的方法。...在 windows 下,可以使用 dumpbin 工具或者 Dependency Walker 工具分析 lib 中是否存在所编写的 C++ 方法。...dumpbin 指令如下: dumpbin /EXPORTS xxx.dll 而 Dependency Walker 只需要打开 dll 文件就可以看到相关信息了。
而我们本文讨论的节信息是没有任何偏移指向的,所以它是紧跟在可选文件头后面的。...但是我这儿说一下,这样做是不严谨的,我会在之后论述这样草率的做法为什么不对。 我先拿我电脑上notepad.exe为例,看看它的节信息 ? ...这个数字是相对字符串表起始位置的偏移RA,我们的真实的节名就保存在字符串表中。我在我电脑上找到一个这样的文件avcodec-52.dll。我们先看Stud_PE的分析结果 ? ...目前微软推荐是:将映像文件调试符号表信息独立的放在PDB文件中,所以不会在PE文件中再保存调试符号表信息,于是这个字段应该为0。当然这并不是硬性要求,我发现我电脑上就存在很多该字段不为0的文件。...刚开始时我也不是很明白它们为什么要使用这个字段,特别是其指向的字符表个数(NumberOfSymbols)为0!!你说既然大小为0,那你指向有什么意思呢?
2、静态库与动态库: 静态库: 函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。...动态库: 动态库一般提供两个文件:一个引入库(.lib),一个是DLL(.dll)文件。.lib文件中包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。...在使用动态库情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中...图示 P703 两个进程访问同一个DLL时的情形 两种加载dll文件的方式,隐式加载和显式加载。 3、Dumpbin命令 应用程序如果想要访问某个DLL中的函数,那么该函数必须是已经被导出的函数。...并在工程属性的链接器的命令行中输入lib符号名文件。把dll文件和lib文件放入指定目录中在工具选项的VC++目录中包含。 (2)利用_declspec(dllimport)于外部函数声明前。
造成这种错误的原因正是导出函数的修饰名称。在dll二进制文件中,经过编译器的“加工”,实际上有了不同的名称。这也是函数重载机制得以实现的一个技术支持。怎么办呢?...输入命令: dumpbin /export 文件全名 将“加工”后的真是函数名复制后,粘贴。...mySub@@YAXHH@Z 即为dumpbin工具找到的真实名。 修改SubDLL.h中的代码(去掉这些不太规范的修饰名称),修改之后重新编译生成CreateDLL.dll。...如SubDLL.lib和你DEBUG文件下的对应(这步没有也可以,因为会在上一步的路径下寻找)。...:×××.lib的解决办法 一般情况是因为没有导入相应的.lib文件,或者是导入的路径有误。
但是实际操作起来并不理想,因为Dependency Walker将exe文件依赖的所有动态库以及动态库所依赖的动态库都列出来了。看得你一脸懵逼: ? ...你很难分清楚:倒底哪些DLL是需要打包的,哪些DLL是系统自带的。而作为打包过程中的一个小步骤,我根本不需要知道这么多信息。这个时候,我们需要一个更加简洁明了的工具。...dumpbin就是今天要介绍的主角。 二、使用 dumpbin是随Visual Studio一起发布的,在Visual Studio的“本机工具命令行”中就可以直接使用。...使用的第一步就是打开Visual Studio的“本机工具命令行”: ? 这里我选择的是“VS2015 X64本机工具命令提示符”。...三、小结 dumpbin的IMPORTS参数是用来查看程序依赖的其他动态库的,这对于可执行程序exe和动态链接库DLL都是适用的。
注:bjam在编译过程中,出错不会停下来,而是直接跳过出错的模块,除非加参数让其遇错停下.而且是边编译边安装....headers *.lib | findstr machine dumpbin/headers *.dll | findstr machine 间接确定某个lib是静态还是动态[会显示其它信息或者对应的...dll] dumpbin/headers *.lib 直接确定某个lib是静态还是动态[会列出包含的obj或者对应的dll] lib /list*.lib 8 Boost安装目录分析 ?...[include]文件夹装的是包含目录,D/R版本的内容完全一样. [lib]文件中,装的都是staticlib文件,D/R版本各有34个lib. lib一一对应,但内容不一样....控制台编译,没有生成PDB. 因为是静态编译,所有没有dll,也没有[bin]文件夹. 静态编译通常没有PDB. ?
WebAssembly是二进制文件格式,所有主要浏览器(IE 11除外)都已实现,以使虚拟机运行。...因为这些语言具有必须包含在WebAssembly二进制文件中的大型运行时,所以它们仅对新建项目才真正实用(即,它们仅可用作JavaScript替代品)。...然而,Rust使用我们将在本系列其他文章中探讨的工具,很容易创建具有相当惯用的JavaScript接口的WebAssembly二进制文件,而c和c++中的过程则更加手动。...如果你有兴趣了解更多关于Rust的Wasm开发,请在评论中告诉我。接下来,我将介绍如何从JavaScript调用Rust。...如果你想对比一下Rust的故事和其他语言的故事,比如c语言和Go语言,请告诉我,以后我会写更多。
前言 最近被微步的一篇文章吸引了,里面讲到银狐通过自解压白 exe + 黑 dll 执行截取主线程添加自启动,发现 dll 与普通的免杀有很大的不同,决定自己尝试一下,虽然我之前没有做过白加黑免杀,感觉应该不会太难...文件、lib 库、dll 库、exe 执行文件,使用方法如下: # 查看 dll 库中包含哪些函数 dumpbin /exports a.dll # 查看 exe 中加载了哪些动态库 dumpbin.../imports a.exe # 查看 lib 库中包含哪些函数 dumpbin /all /rawdata:none a.lib # 查看 obj 文件中包含哪些函数 dumpbin /all /rawdata...1. dll 文件的搜索路径顺序 dll 加载如果指指定了 dll 文件名而没有指定具体路径一般是按照一定的路径顺序一次去搜索,如果能在搜索到正确的 dll 之前使其先搜索到我们的恶意 dll 就能造成...由于我主机上没有安装 ProcessMonitor,因此我需要将 exe 拖到虚拟机中执行。
问题的解决 其实这个问题用 c++ 写个程序是可以解决的,但是一想到要遍历目录、构造文件名 map、对比两个目录中的文件名、对比相同文件名的内容、复制文件到目标目录、压缩目标目录…这一系列操作时,我觉得还是算了...这里没有通过文件后缀(dll / exe)来判断是否为可执行文件,这是因为产品中总有一些 dll 有奇奇怪怪的后缀。...这里统一采用 dumpbin 进行反汇编,如果成功就是可执行文件;反之就是普通的文本或二进制文件。...后来他们通过紧急补丁修复了上述问题,在后面复盘问题的过程中,我手动检查了脚本的运行日志,发现确实没有识别出新旧 derived.dll —— 脚本认为它们是二进制相同的。...上面这个例子中,父类的成员变化后,肯定会有相应的 section 会做出调整,但是我通过调整 dumpbin 的选项也没有对比出这个段在哪里。
与代码中设置的libEasyStreamClient.dll不符合。 ? 我们查找文件,发现可执行文件同目录下存在对应的libEasyStreamClient.dll文件。 ?...这里libEasyStreamClient.lib只是影响编译器编译的时候,link.lib库的问题,和运行时没有任何关系。此时仅仅告诉系统当程序运行时,需要加载这个.dll文件。...通过dumpbin 命令来查看对应的dll dumpbin /headers libEasyStreamClient.lib ?...由此可以看到,这个的DLL Name是EasyStreamClient.dll。所以可执行文件运行时,需要的动态库为EasyStreamClient.dll。...修改路径:属性->输入->模块定义文件 EasyStreamClient.def ? EasyStreamClient.def 中定义了DLL Name ?
大家好,又见面了,我是你们的朋友全栈君。...对比两张图可以发现,带 CrashMe.pdb 的多了 文件位置 和 代码行号,说明这些信息是记录在 pdb 文件中的。...对于 托管程序 和 非托管程序,其 PDB 文件中存储的信息不尽相同,由于 托管程序 的 Metadata 已经存储了 类型定义、函数签名 等信息,所以其 PDB 中的内容相对较少。...我们可以使用 DumpBin.exe 来从 PE 文件中获取 GUID 信息,在控制台中启动该程序,并传入 PDB文件 和 /headers参数 即可。...symbol server 的 cache 中查找 远程的 symbol server 中查找 参考资料 PDB文件详解 – CSDN PDB Files: What Every Developer Must
/*内存中的节对齐*/ DWORD FileAlignment; /*文件中的节对齐*/ WORD MajorOperatingSystemVersion...文件中(PE)我们把后面的二进制都修改为我们的代码 ? 入后偏移(RVA)修改为0000000 ? 运行我们的程序,和调试我们的程序 运行程序: ? 可以正常运行 调试程序: ?.../*在文件中对齐的尺寸*/ DWORD PointerToRawData; /*在文件中的偏移*/ DWORD PointerToRelocations; ...节的属性*/ } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; 重要成员 1.节的尺寸 2.虚拟地址,RVA(偏移) 3.文件中的大小 4.文件中的偏移 5...其中保留的没有写.