nm命令属于GNU binutils的功能,能够输出可执行文件的符号表。它的用法是这样的: 用法:nm [选项] [文件] 列举 [文件] 中的符号 (默认为 a.out)。...按照字典序输出符号表 这里需要用到-n选项,就以DragonOS的内核文件为例,我们输出来看看: nm -n kernel.elf > nm.txt 为了便于查看,上面的命令把nm的输出重定向到了nm.txt...如果可以找到行号信息,显示在符号信息之后 -n, -v, --numeric-sort 按符号对应地址的顺序排序,而非按符号名的字符顺序 -P, --portability 使用 POSIX.2 标准输出格式代替默认的输出格式...例如,升序变为降序 -S, --print-size 以 BSD 输出样式输出已定义符号的值和大小。...例如,对于ARM目标,此选项将跳过用于标记ARM代码、Thumb代码和数据之间转换的映射符号 --synthetic 输出合成符号。
,针对部分符号产生一些修改,在这个过程之后,不会再有符号发生新的变动了 对so来说undef是可以存在的,因此将避免报错,将undef的符号转换为imported,并且修改相关信息。...esym 将protected和hidden的符号进行报错 对esym对应位置的sym进行判断,如果sym所对应的esym是有定义的也跳过。...这种情况是esym实际的定义在其他位置,sym是esym resolve的结果 解析符号名,如果带有版本信息则再次尝试进行重新将esym和sym进行关联。...在一个obj a里面,有一个未定义的符号,链接的时候另一个obj b包含了这个符号的定义,那么这就算是a依赖b。...info 所有的输入文件 也就表示这三者就是确定问题的必要条件,另外还可以认为执行到这里之后符号不会再发生什么改动,也不会产生新的用户引发的问题(比如说少链接文件,或者什么参数错了导致符号决议出问题等
Cloudflare WARP DEPENDENCIES : wlansvc SERVICE_START_NAME : LocalSystem 开发: 成功的尝试将要求本地用户能够将其代码插入操作系统或其他安全应用程序未检测到的系统根路径中...如果成功,本地用户的代码将以应用程序的提升权限执行。
【符号位于内存中未初始化的区域,即BSS段】 "C" The symbol is common....【C表示符号类型是未初始化的。...当链接时,可能出现多个常用符号同名,这时如果该符号值都被定义了,那么会被当作未定义的引用(重定义错误)】 "D" "d" The symbol is in...【输出符号所对应的库的名字,便于查找符号对应的被定义的库】 -a --debug-syms Display all symbols, even debugger-only...【使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f?
, LC_UUID 二进制文件 id,与符号表 uuid 对应,可用作符号表匹配, LC_LOAD_DYLINKER 启动动态加载器, LC_SYMTAB 描述在 __LINKEDIT 段的哪找字符串表...#define SEG_LINKEDIT "__LINKEDIT" // 包含动态链接器所需的符号、字符串表等数据 vmaddr 段的虚存地址(未偏移),由于 ALSR,程序会在进程加上一段偏移量(slide...nm 打印出的信息表明dyld_stub_binder 也是未定义的。...取两者差集,得到没被引用的类的段地址 otool -o 二进制文件,获取段信息 通过脚本使用没被引用的类的段地址去段信息中匹配出具体类名 压缩图片资源 这点就跟本文的主题没什么关系,不感兴趣可以略过。...LC_SYMTAB 指明了 __LINKEDIT 段查找字符串和符号表的位置。我们可以结合 SEG_LINKEDIT 和 LC_SYMTAB 来找到 image 的符号表。
-o mac.dylib 静态链接就是把各个模块组合成一个整体,生成新的 Mach-O,链接的内容就是把各个模块间相互的引用能够正确的链接好,原理就是把一些指令对其他符号的地址引用进行修正。...分析 Mach-O 的工具有分析体系结构的 lipo,显式文件类型的 file,列 Data 内容的 otool,分析 image 每个逻辑信息符号的 pagestuff,符号表显示的 nm。...导入导出符号 执行绑定时,链接程序会用实际定义的地址替换程序的每个导入引用。...通过构建时的选项设置,dyld 可以即时绑定,也叫延迟绑定,首次使用引用时的绑定,在使用符号前不会将程序的引用绑定到共享库的符号。...使用 nm 的 -gm 选项可以查看 Mach-O 导出的符号: nm -gm header.dylib 结果如下: (undefined) external ___cxa_atexit (from libSystem
Modbus 指令 "MB_SERVER" V4.2 以及更高版本和 "Modbus_Slave" V3.0 及更高版本允许你参数化可用的输出点地址范围,来预防 Modbus master (通过功能码...5 或 15) 未授权的访问过程映像输出区....图. 02 通过下面静态变量的 start values 你可以为输出地址定义允许的写操作地址范围 Variable Data type Default value Description QB_Start...Word 0 有效输出地址的起始地址(字节 0 到 65535) QB_Count Word 0xFFFF 能被 Modbus 主站或 Modbus TCP 客户端写操作的输出字节数量 举例 使 "...注意 如果写操作访问的是被禁止的输出地址, the指令 "Modbus_Slave" 和 "MB_SERVER" 返回错误代码 ("STATUS") 16#8383: "请求数据帧包含无效的数据地址".
1.命令简介 nm命令是GNU Binutils二进制工具集的一员,用于显示目标文件中的符号。如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。 nm命令显示的符号类型。...符号的值表示该符号需要的字节数。例如在一个C文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C,否则其类型为B。...它表示一个符号如果被重定位引用,不会计算该符号的地址,而是必须在运行时计算 N 该符号是一个debugging符号。...例如,升序变为降序 -S|--print-size:以BSD输出样式输出已定义符号的值和大小。...未初始化的全局变量dUnInitialized符号类型是B,所以其位于未初始化的BSS段。函数print()的符号类型是T,说明其位于代码段(Text Section)。
C# 中的参数数组、引用参数和输出参数 本文目录 1 参数数组 2 引用参数 3 输出参数 参数数组 在C#中,可以为函数指定一个不定长的参数,这个参数是函数定义中的最后一个参数,这个参数叫做参数数组。...引用参数 可以通过引用传递参数,需要使用ref关键字。...,由于函数SwapInts使用了引用参数,所以可以在函数中修改变量a和b的值,需要注意的是,在调用函数时也要使用ref传递引用参数。...输出参数 输出参数使用out关键字,它的效果与引用参数几乎相同,不同点是: 引用参数的实参必须是已经赋值的变量,而输出参数不必。 函数使用输出参数时,应该把它看作是未赋值的。...."); Console.ReadKey(); } }} 这个函数将一个数组中最大值的索引作为输出参数,返回最大值。
A: 这里涉及到程序链接的两个步骤: 空间与地址分配:扫描所有的输入目标文件,获得它们每个段的长度属性和位置,收集输入目标文件中的符号表中的所有符号定义和符号引用,统一放到一个全局符号表中,合并所有的段...Tips: 外部符号指的是目标文件需要引用的符号,但是定义在其它目标文件中,链接前外部符号地址都是000000之类,链接后的可执行文件就可以看见这些外部符号都是有地址的。...nm -D 显示动态符号 nm -u 仅显示没有定义的外部符号 nm -defined-only 仅显示定义的符号 关于符号的说明: 如果符号类型是小写的,表明符号是局部符号,大写表示符号是全局符号...B:该符号的值出现在.bss段中,未初始化的全局和静态变量。 C:该符号的值在COMMON段中,里面的都是弱符号。 D:该符号位于数据段中。...I:该符号对另一个符号的间接引用 N:debug符号 R:该符号位于只读数据区 T:该符号位于代码段 U:该符号在当前文件未定义,定义在别的文件中 ?
在使用windowsAPI函数的过程中,已经加入了头文件,但是依旧会报error LNK2019: 无法解析的外部符号该符号在函数 _main 中被引用,我以前也用过...API,但是没有出现此问题,最后的解决方案是只需要在pro文件下面加入win32:LIBS += -luser32即可解决问题。...查了半天资料,在qt中调用Windows API函数有时需要自己关联系统库时,不仅仅需要相关的头文件,有些还需要自己关联系统库,就想SystemParametersInfoA()这个函数这样;但是有些系统函数在...参考博文:Qt调用头文件setupapi.h的函数SetupDiGetClassDevs()编译出错
因为空工程不包含任何的源代码文件,接下来你只需要在相应的源代码文件夹和头文件文件夹加入相应的.cpp和.h文件即可。...(stdin)和标准输出(stdout)。...Win32项目:初始代码模版实现一个简单的windows窗口,以WinMain作为程序入口,引用了win32Api头文件和库,链接器subsystem参数为windows,所以生成的程序不带黑色的控制台...,直接使用标准输入和标准输出,看不到效果。...MFC应用程序:本质上是个win32工程,只是默认帮你引用了mfc框架的头文件和库,并且程序入口由mfc框架提供,不需要自己写。
--stop-address=address 显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。 -t --syms 显示文件的符号表入口。...类似于nm -s提供的信息 -T --dynamic-syms 显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。...它显示的信息类似于 nm -D|--dynamic 显示的信息。 -V --version 版本信息 --all-headers -x 显示所可用的头信息,包括符号表、重定位入口。....symtab:一个符号表(symbol table),它存放在程序中被定义和引用的函数和全局变量的信息。一些程序员错误地认为必须通过-g选项来编译一个程序,得到符号表信息。....debug:一个调试符号表,其有些表目是程序中定义的局部变量和类型定义,有些表目是程序中定义和引用的全局变量,有些是原始的C源文件。只有以-g选项调用编译驱动程序时,才会得到这张表。
3.1 反向选择列如果要选择某个文件的所有列,除了指定要排除的列之外,可以使用 --complement 选项。该选项将反向选择列,并将未选择的列输出。...输出重定向符号为了在处理文本数据时能够更加高效地进行后续分析和处理,除了掌握 cut 命令的基本概念和进阶使用技巧外,我们还需要掌握输出重定向符号的使用方法。...输出重定向符号可以将程序或命令的输出结果保存到文件中,而不是直接输出到屏幕上。4.1 > 符号符号用于将程序或命令的输出结果追加到指定文件中。...4.2 > 符号&> 符号用于将程序或命令的输出结果和错误信息都追加到指定文件中。它相当于同时使用 > 和 2> 符号。...为了在处理文本数据时能够更加高效地进行后续分析和处理,我们还需要掌握输出重定向符号的使用方法。输出重定向符号可以将程序或命令的输出结果保存到文件中,而不是直接输出到屏幕上。
在《什么是强符号和弱符号》中简单介绍了强弱符号,那么强弱符号的性质有什么用呢? 还记得在《什么是强符号和弱符号》中提到的链接原则吗?...通俗一点说: 当没有插件时,使用默认行为 链接了插件时,使用插件的功能 原理和示例 其原理也非常简单: 外部引用弱符号 如果符号地址为0,则说明外部没有链接插件库,未有强符号,走默认流程 如果符号地址不为.../main this is weak print 观察可执行文件: $ nm main |grep my_print w my_print 通过nm命令我们也可以知道test_print...最终我们可以通过nm命令看到my_print符号已经不再是W了。也就看到了最后: this is plugin print 的打印了。...总结 由于以下几点原因,我们可以自己做一些支持插件库的程序: 1.重复强弱符号同存在时,使用强符号 2.弱符号链接不存在时,不会报错 3.未链接的外部符号,地址为0,可通过判断避免访问非法地址 再结合前面的例子分别解释一下
本文告诉大家如何修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹的问题。...如果 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹,那将会在调试的时候,由于找不到 PDB 符号文件而加载符号失败 尽管这个坑从 2017 到现在,来来回回修了好多次...本文将告诉大家如何强行设置拷贝 PDB 符号文件 方法是在自己的项目的 csproj 项目文件夹里面添加如下代码 <Target Name="IncludeSymbolFromReferences"...任务,这个任务里面,将会尝试去找所有的引用的 pdb 文件,如果找到了,就放入到输出拷贝里面 如此即可在构建时,将引用的 NuGet 包的 DLL 对应 PDB 文件拷贝到输出文件夹,而不需要关注具体的框架版本...当然,在每个项目都拷贝以上的代码也不是好主意。
为什么编译器把未初始化的全局变量标记为一个COMMON符号,而不直接把它当作未初始化的局部静态变量,为其在.bss段分配空间呢?...(2)链接时,读取了所有目标文件,确定了任意一个弱符号的大小。这时才在最终输出文件的.BSS段中为其分配空间。 (3)总体看来,未初始化的全局变量最终还是被放在.BSS段。...symtab) 9.1 符号简介 链接过程的本质就是要把多个不同的目标文件之间像拼图一样拼起来,相互拼合实际上是目标文件之间对地址的引用,即对函数和变量的地址的引用。...我们可以使用很多工具查看 ELF 文件的符号表,比如 readelf、objdump 和 nm 等,比如使用 nm 查看 test.o 的结果如下: nm test.o 0000000000000000...,未初始化的全局符号就是这种类型的 SHN_UNDEF 0 表示该符号未定义。
及作用 command 作用 LC_SEGMENT/LC_SEGMENT_64 将对应的段中的数据加载并映射到进程的内存空间去 LC_SYMTAB 符号表信息 LC_DYSYMTAB...的引用 __objc_classrefs 指向classes的引用 __objc_superrefs 指向super classes的引用 __mod_init_func 初始化的全局函数地址...,在 main 之前被调用 __bss 未初始化的静态变量 _got 存储引用符号的实际地址,类似于动态符号表 __bss 未初始化的静态变量 __nl_symbol_ptr 非lazy-binding...Rebase数据描述了哪些是对指向Mach-O内部的引用并将其修正,而Bind数据描述哪些是指向外部的引用并进行修正。...每次binding是在 rebasing之后进行的,他们交替进行,每个Mach-O镜像加载完成后需要将内部的地址引用都修正为偏移之后的正确地址,然后执行binding来修改外部引用地址。
然而,如果使用未重写equals()和hashCode()方法的引用对象进行去重,可能会导致意外的行为,最近了在项目中就遇到了这个情况,让我们深入探讨这个问题,并引以为戒,确保正确实现去重操作。...问题所在:未重写equals和hashCode方法的引用对象 引用对象在Java中默认是根据内存地址进行比较的。...默认的equals()方法是使用==操作符进行引用地址比较,hashCode()方法是根据内存地址计算的哈希码。...总结 使用Set集合进行去重是一个常见的操作,但必须谨慎处理引用对象的去重。 未重写equals()和hashCode()方法可能导致意外的去重行为,集合中可能包含相同内容但被认为不同的对象。...引以为戒,避免在Set中使用未重写equals()和hashCode()方法的引用对象进行去重,以确保代码的正确性和稳定性。
通过nm命令就可以查看符号信息,这里就有我们的func_symbol函数和全局变量symbol的符号。...关于nm的使用,在《几个命令了解ELF文件的秘密》也有介绍。 除了上面提到的全局符号,目标文件中还有其他符号信息,不过这不是本文关注的重点。...强符号与弱符号 对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。...通过下面的例子来看看哪些是强符号,哪些是弱符号: #include int weak; // 未初始化全局变量,弱符号 int strong = 1024; // 已初始化全局变量,强符号...而第二点也有示例,示例中,虽然定义了两个num,但是var.c中未初始化的num是弱符号,main.c中的num是强符号,这种情况下编译正常。只是最终会使用强符号的num。
领取专属 10元无门槛券
手把手带您无忧上云