GCC 符号表小结【转】
转自:https://blog.csdn.net/swedenfeng/article/details/53417085
1) 如何生成不含符号表的目标文件 ?
#一个方式是编译的时候使用 选项 s
root@root2768:~/test_c>gcc -s test1.c
root@root2768:~/test_c> objdump -t a.out
a.out: file format elf64-x86-64
SYMBOL TABLE:
no symbols
# 另外一个方式是,生成目标文件以后,使用strip命令从目标文件中去掉符号表
root@root2768:~/test_c> gcc test1.c
root@root2768:~/test_c> objdump -t a.out
a.out: file format elf64-x86-64
SYMBOL TABLE:
0000000000400238 l d .interp 0000000000000000 .interp
0000000000400254 l d .note.ABI-tag 0000000000000000 .note.ABI-tag
0000000000400274 l d .note.SuSE 0000000000000000 .note.SuSE
000000000040028c l d .note.gnu.build-id
0000000000000000 .note.gnu.build-id
00000000004002b0 l d .hash 0000000000000000 .hash
00000000004002c8 l d .gnu.hash 0000000000000000 .gnu.hash
00000000004002e8 l d .dynsym 0000000000000000 .dynsym
0000000000400330 l d .dynstr 0000000000000000 .dynstr
0000000000400368 l d .gnu.version 0000000000000000 .gnu.version
0000000000400370 l d .gnu.version_r 0000000000000000 .gnu.version_r
0000000000400390 l d .rela.dyn 0000000000000000 .rela.dyn
00000000004003a8 l d .rela.plt 0000000000000000 .rela.plt
00000000004003c0 l d .init 0000000000000000 .init
00000000004003e0 l d .plt 0000000000000000 .plt
0000000000400400 l d .text 0000000000000000 .text
00000000004005d8 l d .fini 0000000000000000 .fini
00000000004005f0 l d .rodata 0000000000000000 .rodata
00000000004005f4 l d .eh_frame_hdr 0000000000000000 .eh_frame_hdr
0000000000400628 l d .eh_frame 0000000000000000 .eh_frame
0000000000600e30 l d .ctors 0000000000000000 .ctors
0000000000600e40 l d .dtors 0000000000000000 .dtors
0000000000600e50 l d .jcr 0000000000000000 .jcr
0000000000600e58 l d .dynamic 0000000000000000 .dynamic
0000000000600ff8 l d .got 0000000000000000 .got
0000000000601000 l d .got.plt 0000000000000000 .got.plt
0000000000601020 l d .data 0000000000000000 .data
0000000000601038 l d .bss 0000000000000000 .bss
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 l d .comment.SUSE.OPTs
0000000000000000 .comment.SUSE.OPTs
0000000000000000 l d .debug_aranges 0000000000000000 .debug_aranges
0000000000000000 l d .debug_pubnames 0000000000000000 .debug_pubnames
0000000000000000 l d .debug_info 0000000000000000 .debug_info
0000000000000000 l d .debug_abbrev 0000000000000000 .debug_abbrev
0000000000000000 l d .debug_line 0000000000000000 .debug_line
0000000000000000 l d .debug_frame 0000000000000000 .debug_frame
0000000000000000 l d .debug_str 0000000000000000 .debug_str
0000000000000000 l d .debug_loc 0000000000000000 .debug_loc
0000000000000000 l d .debug_ranges 0000000000000000 .debug_ranges
0000000000000000 l df *ABS* 0000000000000000 init.c
0000000000000000 l df *ABS* 0000000000000000
0000000000000000 l df *ABS* 0000000000000000 initfini.c
000000000040042c l F .text 0000000000000000 call_gmon_start
00000000004005e8 l .fini 0000000000000000 _real_fini
0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
0000000000600e30 l O .ctors 0000000000000000 __CTOR_LIST__
0000000000600e40 l O .dtors 0000000000000000 __DTOR_LIST__
0000000000600e50 l O .jcr 0000000000000000 __JCR_LIST__
0000000000400450 l F .text 0000000000000000 __do_global_dtors_aux
0000000000601038 l O .bss 0000000000000001 completed.6159
0000000000601040 l O .bss 0000000000000008 dtor_idx.6161
00000000004004c0 l F .text 0000000000000000 frame_dummy
0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
0000000000600e38 l O .ctors 0000000000000000 __CTOR_END__
0000000000400700 l O .eh_frame 0000000000000000 __FRAME_END__
0000000000600e50 l O .jcr 0000000000000000 __JCR_END__
00000000004005a0 l F .text 0000000000000000 __do_global_ctors_aux
0000000000000000 l df *ABS* 0000000000000000 initfini.c
0000000000000000 l df *ABS* 0000000000000000 test1.c
0000000000000000 l df *ABS* 0000000000000000 elf-init.c
0000000000000000 l df *ABS* 0000000000000000
0000000000600e2c l .ctors 0000000000000000 __init_array_end
0000000000600e58 l O .dynamic 0000000000000000 _DYNAMIC
0000000000600e2c l .ctors 0000000000000000 __init_array_start
0000000000601000 l O .got.plt 0000000000000000 _GLOBAL_OFFSET_TABLE_
0000000000400500 g F .text 0000000000000002 __libc_csu_fini
0000000000601048 g O .bss 0000000000000004 global_x
0000000000601020 w .data 0000000000000000 data_start
0000000000601034 g .data 0000000000000000 _edata
00000000004005d8 g F .fini 0000000000000010 _fini
0000000000600e48 g O .dtors 0000000000000000 .hidden __DTOR_END__
0000000000000000 F *UND* 0000000000000000 __libc_start_main@@GLIBC_2.2.5
0000000000601020 g .data 0000000000000000 __data_start
0000000000000000 w *UND* 0000000000000000 __gmon_start__
0000000000601028 g O .data 0000000000000000 .hidden __dso_handle
00000000004005f0 g O .rodata 0000000000000004 _IO_stdin_used
0000000000601030 g O .data 0000000000000004 global_y
0000000000400510 g F .text 0000000000000089 __libc_csu_init
0000000000601050 g .bss 0000000000000000 _end
0000000000400400 g F .text 0000000000000000 _start
0000000000601034 g .bss 0000000000000000 __bss_start
00000000004004ec g F .text 0000000000000012 main
0000000000000000 w *UND* 0000000000000000 _Jv_RegisterClasses
00000000004003c0 g F .init 0000000000000000 _init
root@root2768:~/test_c> strip a.out
root@root2768:~/test_c> objdump -t a.out
a.out: file format elf64-x86-64
SYMBOL TABLE:
no symbols
# 两种方式的区别,拷贝自stackoverflow
gcc being a compiler/linker, its -s option is something done while compiling and linking. It's also not configurable - it has a set of information which it removes, no more no less.
strip is something which can be run on an object file which is already compiled. It also has a variety of command-line options which you can use to configure which information will be removed. For example, -g strips only the debug information which gcc -g adds.
Note that strip is not a bash command, though you may be running it from a bash shell. It is a command totally separate from bash, part of the GNU binary utilities suite.
2) 如何查看目标文件的符号表 ?
#一个方式是使用 objdump
root@root2768:~/test_c> objdump -t test1.o
test1.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 test1.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l O .data 0000000000000004 global_s // local, can not be referenced when linking
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment.SUSE.OPTs
0000000000000000 .comment.SUSE.OPTs
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000004 g O .data 0000000000000004 global_y // global, can be referenced when linking
0000000000000000 g F .text 000000000000001a main
0000000000000000 *UND* 0000000000000000 global_x //undefined symbol, will search from other obj file when linking
0000000000000000 *UND* 0000000000000000 foo //undefined symbol, will search from other obj file when linking
#另外一个方式是使用 nm
ejinfeg@esekilxxen2768:~/test_c> nm -S test1.o
U foo //undefined symbol, will search from other obj file when linking
0000000000000000 0000000000000004 d global_s //initialized local variable, can not be referenced by other obj file when linking
U global_x //undefined symbol, will search from other obj file when linking
0000000000000004 0000000000000004 D global_y //initialized global variable, can be referenced by other obj file when linking
0000000000000000 000000000000001a T main
C代码 test1.c
extern int foo ( int x );
extern int global_x;
static global_s = 2;
int global_y = 1;
int main ()
{
foo(global_x);
int local_x;
return 0;
}
# 附上 nm 命令链接
http://man7.org/linux/man-pages/man1/nm.1.html
##博客仅作个人记录##
---------------------
本文来自 swedenfeng 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/swedenfeng/article/details/53417085?utm_source=copy
GCC 符号表小结【转】的更多相关文章
- GCC制作动态库导出符号表【转】
转自:https://blog.csdn.net/whb_fei/article/details/76974543 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- C++编译器符号表有哪些内容?
http://blog.csdn.net/wangbingcsu/article/details/48340479 C++编译器符号表有哪些内容? 很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔 ...
- 使用objdump objcopy查看与修改符号表
使用objdump objcopy查看与修改符号表动态库Linuxgccfunction 我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库.这时需要查看可执行程序或者动态库中的符 ...
- 程序减肥,strip,eu-strip 及其符号表
程序减肥,strip,eu-strip 及其符号表 我们要给我们生成的可执行文件和DSO瘦身,因为这样可以节省更多的磁盘空间,所以我们移除了debug信息,移除了符号表信息,同时我们还希望万一出事了, ...
- ELF格式文件符号表全解析及readelf命令使用方法
http://blog.csdn.net/edonlii/article/details/8779075 1. 读取ELF文件头: $ readelf -h signELF Header: Magi ...
- 程序运行之ELF 符号表
当一个工程中有多个文件的时候,链接的本质就是要把多个不同的目标文件相互粘到一起.就想玩具积木一样整合成一个整体.为了使不同的目标文件之间能够相互粘合,这些目标文件之间必须要有固定的规则才行.比如目标文 ...
- C 符号表导出
编译符号表导出示例: 使用GCC编译链接参数--version-script 控制动态符号表,如想 使用链接参数 --retain-symbols-file 控制静态符号表,--version-scr ...
- GDB如何调试没有符号表(未加-g选项的编译)的程序
/********************************************************************* * Author : Samson * Date ...
- C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
详解link 有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错 ...
随机推荐
- Leetcode 268.缺失数字 By Python
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [9,6,4,2 ...
- 机器学习&深度学习资料收集
缘由 以下博客都是我在学习过程中看到的一些知识讲解非常好的博文,就不转载了,直接给出链接方便以后重复访问.有了自己的理解之后再重新整理资料发布吧 : ) sklearn系列 http://www.cn ...
- EFCodeFirst快速搭建入门
EFCodeFirst快速搭建入门 1.新建Model类库项目. 添加EntityFramework.dll的引用. 编写实体类Course,Student. namespace EFCodeFirs ...
- 【CF711D】Directed Roads
题目大意:给定一个 N 个点,N 条边的无向图,现给每条边定向,求有多少种定向方式使得定向后的有向图中无环. 题解:显然,这是一个外向树森林,定向后存在环的情况只能发生在基环树中环的位置,环分成顺时针 ...
- 树链剖分&dfs序
树上问题 很多处理区间的问题(像是RMQ,区间修改).可以用线段树,树状数组,ST表这些数据结构来维护.但是如果将这些问题挪到了树上,就不能直接用这些数据结构来处理了.这时就用到了dfs序和树链剖分. ...
- Redis集群中的节点如何保证数据一致
主从复制: 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而 ...
- 获取当前操作系统的ip
代码如下: #include "stdafx.h" #include <WinSock2.h> int get_local_ip() { WSADATA wsaData ...
- logback异步输出日志(生产者消费者模型),并非批量写入日志。
一直对logback异步输出日志误解为异步批量写入日志. 今天看了源代码. 首先logback的异步日志是如何配置的: <!-- 管理端用户行为日志异步输出,异步的log片段必须在同步段后面,否 ...
- 996ICU与程序猿的个人成长
目录 规划 学习 专业领域知识 知识广度 第二职业 理财 借势 添砖加瓦 最近一段时间,996ICU在互联网界引发"大地震",从普通员工.行业大佬甚至官媒都进行了发声,大家对这个问 ...
- Keil4 几例异常解决办法
以下几个问题在Keil5上没有发现,不过因为下载的例子都是Keil4,强迫症让我用起了Keil4 错误一:main.c: Warning: C3910W: Old syntax, please use ...