首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

目标文件或可执行文件中的符号信息和调试信息是怎么回事儿?

  • 25-03-05 06:00
  • 2164
  • 11648
blog.csdn.net

交叉编译命令:

arm-buildroot-linux-gnueabihf-strip
  • 1

可以去除可执行文件中的符号信息和调试信息,进而减少生成的二进制文件的体积,使得生成的二进制文件更加紧凑,且不可读。对于生产环境中的可执行文件,strip 可以有效减小文件大小,提升加载速度。

那么问题来了,可执行文件中的符号信息和调试信息是怎么回事儿?

当我们提到 arm-buildroot-linux-gnueabihf-strip 去除的 符号信息 和 调试信息,我们指的是目标文件或可执行文件中,供编译器、调试器、链接器使用的信息。具体来说,这些信息包括符号表、调试信息、以及与程序调试和优化相关的其他内容。

以下是一些具体的符号信息和调试信息的例子:

1. 符号信息(Symbol Information)

符号信息是关于程序中函数、变量等的标识符和它们在内存中的位置。符号表包含了这些信息,用于编译、链接和调试。

  • 符号表:符号表包含了程序中所有变量和函数的名称及其地址。它的作用是帮助编译器和链接器定位和解析函数、变量等符号。

    示例:

    • 函数符号:例如 main、init、my_function。
    • 变量符号:例如 g_variable、my_array。
  • 符号信息的例子:

    00000000 T _start
    08048420 T main
    08048460 B g_variable
    
    • 1
    • 2
    • 3

    其中,符号 main 是一个函数符号,它的地址为 08048420,而符号 g_variable 是一个变量,它存储在 .bss 段(通常是未初始化的全局变量区域)中,地址是 08048460。

2. 调试信息(Debug Information)

调试信息包含了源代码与生成的机器代码之间的映射。它通常在编译时通过添加 -g 选项生成,包含了源代码行号、函数名、变量名等信息,用于在调试时恢复源代码结构。

  • 行号信息:记录了每个机器指令对应的源代码行号,调试器可以用这些信息来显示调试过程中的源代码。

  • 变量和函数的类型信息:包括局部变量、全局变量、函数参数等的类型信息(如 int、float、struct 等)。

  • 文件和函数名:调试信息包含了源文件名和函数名,用于帮助开发者在调试过程中识别和定位问题。

  • 调试信息的例子:

    .debug_info:
        0x00000000  DW_TAG_compile_unit
        0x00000004  DW_AT_name     "main.c"
        0x00000008  DW_TAG_subprogram
        0x0000000c  DW_AT_name     "main"
        0x00000010  DW_AT_type     DW_FORM_ref4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这表示源文件 main.c 中的 main 函数的调试信息,调试器可以通过这些信息知道 main 函数在源代码中的位置,并映射到相应的机器代码指令。

3. 去除符号信息和调试信息的效果

当我们执行 strip 命令时,它会从目标文件或可执行文件中去除这些符号和调试信息,从而使得生成的二进制文件更加紧凑,且不可读。

示例:

假设我们有一个可执行文件 myprogram,并使用 objdump 查看它的符号和调试信息:

arm-buildroot-linux-gnueabihf-objdump -t myprogram
  • 1

输出可能包含符号信息(例如函数和变量名):

00008060 g     F .text  00000034              main
00008094 g     B .bss   00000004              g_variable
  • 1
  • 2

然后,执行 strip 命令:

arm-buildroot-linux-gnueabihf-strip myprogram
  • 1

执行完毕后,再次使用 objdump 查看:

arm-buildroot-linux-gnueabihf-objdump -t myprogram
  • 1

此时,可能会看到符号信息已经消失,输出变得更简洁,没有了函数名、变量名等信息:

00008060 g     F .text  00000034
  • 1

可以看到,原本的符号信息(如 main 和 g_variable)已经被去除,strip 命令减少了可执行文件的体积,但去除了调试所需的符号和调试信息。

总结

  • 符号信息:包括程序中的函数、变量的名称和地址。
  • 调试信息:包括源代码行号、变量类型、函数调用信息等,用于调试时映射源代码和机器代码。
  • 执行 strip 命令会去除这些信息,减少文件大小,但也使得调试变得更加困难,因为我们无法再查看源代码中的变量、函数名等符号。
昊虹嵌入式技术交流群
QQ群名片
注:本文转载自blog.csdn.net的昊虹AI笔记的文章"https://blog.csdn.net/wenhao_ir/article/details/144533396"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top