首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux下,使用nm命令输出可执行文件符号

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 输出合成符号

2.4K30

mold源码阅读九 解析符号处理

,针对部分符号产生一些修改,在这个过程之后,不会再有符号发生新变动了 对so来说undef是可以存在,因此将避免报错,将undef符号转换为imported,并且修改相关信息。...esym 将protected和hidden符号进行报错 对esym对应位置sym进行判断,如果sym所对应esym是有定义也跳过。...这种情况是esym实际定义在其他位置,sym是esym resolve结果 解析符号名,如果带有版本信息则再次尝试进行重新将esym和sym进行关联。...在一个obj a里面,有一个未定义符号,链接时候另一个obj b包含了这个符号定义,那么这就算是a依赖b。...info 所有的输入文件 也就表示这三者就是确定问题必要条件,另外还可以认为执行到这里之后符号不会再发生什么改动,也不会产生新用户引发问题(比如说少链接文件,或者什么参数错了导致符号决议出问题等

17610
您找到你想要的搜索结果了吗?
是的
没有找到

探秘 Mach-O 文件

, 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 符号表。

2.2K30

Apple 操作系统可执行文件 Mach-O

-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

2.8K10

预防对你 Modbus slave输出 授权访问?

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: "请求数据帧包含无效数据地址".

80810

Linux命令(63)——nm

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)。

4.4K00

C# 中参数数组、引用参数和输出参数

C# 中参数数组、引用参数和输出参数 本文目录 1 参数数组 2 引用参数 3 输出参数 参数数组 在C#中,可以为函数指定一个不定长参数,这个参数是函数定义中最后一个参数,这个参数叫做参数数组。...引用参数 可以通过引用传递参数,需要使用ref关键字。...,由于函数SwapInts使用了引用参数,所以可以在函数中修改变量a和b值,需要注意是,在调用函数时也要使用ref传递引用参数。...输出参数 输出参数使用out关键字,它效果与引用参数几乎相同,不同点是: 引用参数实参必须是已经赋值变量,而输出参数不必。 函数使用输出参数时,应该把它看作是赋值。...."); Console.ReadKey(); } }} 这个函数将一个数组中最大值索引作为输出参数,返回最大值。

3.2K30

程序一定要从main函数开始运行吗?

A: 这里涉及到程序链接两个步骤: 空间与地址分配:扫描所有的输入目标文件,获得它们每个段长度属性和位置,收集输入目标文件中符号表中所有符号定义和符号引用,统一放到一个全局符号表中,合并所有的段...Tips: 外部符号指的是目标文件需要引用符号,但是定义在其它目标文件中,链接前外部符号地址都是000000之类,链接后可执行文件就可以看见这些外部符号都是有地址。...nm -D 显示动态符号 nm -u 仅显示没有定义外部符号 nm -defined-only 仅显示定义符号 关于符号说明: 如果符号类型是小写,表明符号是局部符号,大写表示符号是全局符号...B:该符号值出现在.bss段中,初始化全局和静态变量。 C:该符号值在COMMON段中,里面的都是弱符号。 D:该符号位于数据段中。...I:该符号对另一个符号间接引用 N:debug符号 R:该符号位于只读数据区 T:该符号位于代码段 U:该符号在当前文件未定义,定义在别的文件中 ?

1.2K30

objdump命令解析

--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选项调用编译驱动程序时,才会得到这张表。

4.5K21

cut 命令基本概念、进阶使用技巧和输出重定向符号使用方法

3.1 反向选择列如果要选择某个文件所有列,除了指定要排除列之外,可以使用 --complement 选项。该选项将反向选择列,并将选择输出。...输出重定向符号为了在处理文本数据时能够更加高效地进行后续分析和处理,除了掌握 cut 命令基本概念和进阶使用技巧外,我们还需要掌握输出重定向符号使用方法。...输出重定向符号可以将程序或命令输出结果保存到文件中,而不是直接输出到屏幕上。4.1 > 符号符号用于将程序或命令输出结果追加到指定文件中。...4.2 > 符号&> 符号用于将程序或命令输出结果和错误信息都追加到指定文件中。它相当于同时使用 > 和 2> 符号。...为了在处理文本数据时能够更加高效地进行后续分析和处理,我们还需要掌握输出重定向符号使用方法。输出重定向符号可以将程序或命令输出结果保存到文件中,而不是直接输出到屏幕上。

71210

骚操作:利用强弱符号制作插件库

在《什么是强符号和弱符号》中简单介绍了强弱符号,那么强弱符号性质有什么用呢? 还记得在《什么是强符号和弱符号》中提到链接原则吗?...通俗一点说: 当没有插件时,使用默认行为 链接了插件时,使用插件功能 原理和示例 其原理也非常简单: 外部引用符号 如果符号地址为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,可通过判断避免访问非法地址 再结合前面的例子分别解释一下

41210

修复 VisualStudio 构建时没有将 NuGet PDB 符号文件拷贝到输出文件夹

本文告诉大家如何修复 VisualStudio 构建时没有将 NuGet PDB 符号文件拷贝到输出文件夹问题。...如果 VisualStudio 构建时没有将 NuGet PDB 符号文件拷贝到输出文件夹,那将会在调试时候,由于找不到 PDB 符号文件而加载符号失败 尽管这个坑从 2017 到现在,来来回回修了好多次...本文将告诉大家如何强行设置拷贝 PDB 符号文件 方法是在自己项目的 csproj 项目文件夹里面添加如下代码 <Target Name="IncludeSymbolFromReferences"...任务,这个任务里面,将会尝试去找所有的引用 pdb 文件,如果找到了,就放入到输出拷贝里面 如此即可在构建时,将引用 NuGet 包 DLL 对应 PDB 文件拷贝到输出文件夹,而不需要关注具体框架版本...当然,在每个项目都拷贝以上代码也不是好主意。

1.1K10

认识目标文件结构

为什么编译器把初始化全局变量标记为一个COMMON符号,而不直接把它当作初始化局部静态变量,为其在.bss段分配空间呢?...(2)链接时,读取了所有目标文件,确定了任意一个弱符号大小。这时才在最终输出文件.BSS段中为其分配空间。 (3)总体看来,初始化全局变量最终还是被放在.BSS段。...symtab) 9.1 符号简介 链接过程本质就是要把多个不同目标文件之间像拼图一样拼起来,相互拼合实际上是目标文件之间对地址引用,即对函数和变量地址引用。...我们可以使用很多工具查看 ELF 文件符号表,比如 readelf、objdump 和 nm 等,比如使用 nm 查看 test.o 结果如下: nm test.o 0000000000000000...,初始化全局符号就是这种类型 SHN_UNDEF 0 表示该符号未定义。

1.1K30

Mach-O相关概念

及作用 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来修改外部引用地址。

90710

引以为戒:避免在Set中使用重写equals和hashCode引用对象进行去重

然而,如果使用重写equals()和hashCode()方法引用对象进行去重,可能会导致意外行为,最近了在项目中就遇到了这个情况,让我们深入探讨这个问题,并引以为戒,确保正确实现去重操作。...问题所在:重写equals和hashCode方法引用对象 引用对象在Java中默认是根据内存地址进行比较。...默认equals()方法是使用==操作符进行引用地址比较,hashCode()方法是根据内存地址计算哈希码。...总结 使用Set集合进行去重是一个常见操作,但必须谨慎处理引用对象去重。 重写equals()和hashCode()方法可能导致意外去重行为,集合中可能包含相同内容但被认为不同对象。...引以为戒,避免在Set中使用重写equals()和hashCode()方法引用对象进行去重,以确保代码正确性和稳定性。

29840

函数或全局变量重复定义时会怎样?

通过nm命令就可以查看符号信息,这里就有我们func_symbol函数和全局变量symbol符号。...关于nm使用,在《几个命令了解ELF文件秘密》也有介绍。 除了上面提到全局符号,目标文件中还有其他符号信息,不过这不是本文关注重点。...强符号与弱符号 对于C/C++语言来说,编译器默认函数和初始化了全局变量为强符号初始化全局变量为弱符号。...通过下面的例子来看看哪些是强符号,哪些是弱符号: #include int weak; // 初始化全局变量,弱符号 int strong = 1024; // 已初始化全局变量,强符号...而第二点也有示例,示例中,虽然定义了两个num,但是var.c中初始化num是弱符号,main.c中num是强符号,这种情况下编译正常。只是最终会使用强符号num。

1.7K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券