通常公司发布的可执行程序和动态共享库(.SO)里面的符号表都被移除了,所以每次遇到core dump的时候,都需要将符号表导入到/usr/lib/debug目录下。一直没弄明白为啥是这个目录,能不能是其他目录,这篇文章探索一下相关的知识,做个记录。
我们要给我们生成的可执行文件和.SO瘦身,因为这样可以节省更多的磁盘空间,所以我们移除了debug信息,移除了符号表信息,同时我们还希望万一出事了,比如coredump了,我们能获取更多的信息,这时候我们又希望有符号表。
我们等不能做到呢。Linux下是怎么解决这个矛盾的呢?先看第一个问题,程序减肥。
main调用了foo,foo调用了bar,其中bar故意访问了非法地址,为了引起core dump。
tsh@tsh-virtual-machine:~/codeTest/segmentErr/stripTest$ cat stripTest.c
#include<stdio.h>
#include<stdlib.h>
int bar()
{
char *p = NULL;
fprintf(stderr,"I am bar,I will core dump\n");
fprintf(stderr,"%s",p);
return 0;
}
int foo()
{
int i ;
fprintf(stderr, "I am foo,I will call bar\n");
bar();
return 0;
}
int main()
{
fprintf(stderr,"I am main, I wll can foo\n");
foo();
return 0;
}
tsh@tsh-virtual-machine:~/codeTest/segmentErr/stripTest$
先编译出一个debug版本来,然后我们看下可执行程序的大小
tsh@tsh-virtual-machine:~/codeTest/segmentErr/stripTest$ gcc -g -o stripTest stripTest.c
tsh@tsh-virtual-machine:~/codeTest/segmentErr/stripTest$ ll
total 24
drwxrwxr-x 2 tsh tsh 4096 Apr 30 10:23 ./
drwxrwxr-x 5 tsh tsh 4096 Apr 30 09:42 ../
-rwxrwxr-x 1 tsh tsh 11152 Apr 30 10:23 stripTest*
-rw-rw-r-- 1 tsh tsh 361 Apr 30 09:43 stripTest.c
tsh@tsh-virtual-machine:~/codeTest/segmentErr/stripTest$
tsh@tsh-virtual-machine:~/codeTest/segmentErr/stripTest$ readelf -S stripTest
There are 36 section headers, starting at offset 0x2290:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 0000000000400274 00000274
0000000000000024 0000000000000000 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000400298 00000298
0000000000000024 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 00000000004002c0 000002c0
0000000000000090 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 0000000000400350 00000350
000000000000004c 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 000000000040039c 0000039c
000000000000000c 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 00000000004003a8 000003a8
0000000000000020 0000000000000000 A 6 1 8
[ 9] .rela.dyn RELA 00000000004003c8 000003c8
0000000000000030 0000000000000018 A 5 0 8
[10] .rela.plt RELA 00000000004003f8 000003f8
0000000000000048 0000000000000018 AI 5 24 8
[11] .init PROGBITS 0000000000400440 00000440
000000000000001a 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 0000000000400460 00000460
0000000000000040 0000000000000010 AX 0 0 16
[13] .plt.got PROGBITS 00000000004004a0 000004a0
0000000000000008 0000000000000000 AX 0 0 8
[14] .text PROGBITS 00000000004004b0 000004b0
0000000000000222 0000000000000000 AX 0 0 16
[15] .fini PROGBITS 00000000004006d4 000006d4
0000000000000009 0000000000000000 AX 0 0 4
[16] .rodata PROGBITS 00000000004006e0 000006e0
0000000000000055 0000000000000000 A 0 0 4
[17] .eh_frame_hdr PROGBITS 0000000000400738 00000738
0000000000000044 0000000000000000 A 0 0 4
[18] .eh_frame PROGBITS 0000000000400780 00000780
0000000000000134 0000000000000000 A 0 0 8
[19] .init_array INIT_ARRAY 0000000000600e10 00000e10
0000000000000008 0000000000000000 WA 0 0 8
[20] .fini_array FINI_ARRAY 0000000000600e18 00000e18
0000000000000008 0000000000000000 WA 0 0 8
[21] .jcr PROGBITS 0000000000600e20 00000e20
0000000000000008 0000000000000000 WA 0 0 8
[22] .dynamic DYNAMIC 0000000000600e28 00000e28
00000000000001d0 0000000000000010 WA 6 0 8
[23] .got PROGBITS 0000000000600ff8 00000ff8
0000000000000008 0000000000000008 WA 0 0 8
[24] .got.plt PROGBITS 0000000000601000 00001000
0000000000000030 0000000000000008 WA 0 0 8
[25] .data PROGBITS 0000000000601030 00001030
0000000000000010 0000000000000000 WA 0 0 8
[26] .bss NOBITS 0000000000601040 00001040
0000000000000010 0000000000000000 WA 0 0 32
[27] .comment PROGBITS 0000000000000000 00001040
0000000000000035 0000000000000001 MS 0 0 1
[28] .debug_aranges PROGBITS 0000000000000000 00001075
00000000000000
文章浏览阅读634次。对于copy功能PostgreSQL从9.2.4到16devel是否有过优化?或者openGauss是否持续合并或优化PostgreSQL的copy功能,这方面我没有去考证过。单纯从测试结果上看,openGauss的copy性能要略逊于PostgreSQL。当然,可能是我水平有限,所以希望各位openGauss的专家、老师集思广益,还openGauss一个真实的COPY FROM文件导入性能。(大家可以回复优化方案,我这边去做验证)_copy to or from a file is prohibited for security concerns
文章浏览阅读1.1k次,点赞23次,收藏27次。基于springboot的体育馆使用预约系统_基于springboot的体育馆预约管理系统
文章浏览阅读390次。SpringSpring Bean 的作用域有哪些?它的注册方式有几种?Spring 容器中管理一个或多个 Bean,这些 Bean 的定义表示为 BeanDefinition 对象,具体包含以下重要信息:Bean 的实际实现类;Bean 的引用或者依赖项;Bean 的作用范围;singleton:单例(默认);prototype:原型,每次调用bean都会创建新实例;request:每次http请求都会创建新的bean;session:同一个http session共享一个bean_spring和springboot的常见面试题
文章浏览阅读1.9k次。Openstack认证服务(认证组件)3_openstack 认证服务
文章浏览阅读4.5k次。第11节:人与人的相处(1) 2006-6-7 8∶40∶00 人与人的相处 一、有后台的下属。 我遇见过,也处理得很好。你不能得罪他背后的人,那么就通过他去利用他背后的人。比如说他是老板的亲戚,碰见别的部门有什么搞不定的人,你美言他几句叫他去搞,成功了自然是别人给老板面子,失败了你也可以多多积累他的错误,日后真到不得不踢人的时候也派得上..._外企重视documentation
文章浏览阅读3.4k次。这个应用程序是用iOS 15.5 SDK构建的。从2023年4月开始,所有提交到应用商店的iOS应用程序都必须使用iOS 16.1 SDK或更高版本构建,包括在Xcode 14.1或更高版本中。目前iOS 开发工具Xcode 版本号是13.4.1 ,系统无法升级,也会导致Xcode无法升级。1、苹果官方提示: 2023年4月开始,开发必须使用 Xcode 14.1 以上的版本,2、目前此电脑无法在升级, 2023年4月开始 ,此电脑就无法正常开发使用,应用程序商店连接操作错误。_sdk version issue. this app was built with the ios 15.5 sdk. all ios and ipa
文章浏览阅读1.8w次,点赞2次,收藏65次。前端如何使用以太坊智能合约方法这里讲的是前端与MetaMask之间的交互文中涉及到的官方文档web3.js 1.0中文手册MetaMask官方文档web3.js文件链接:https://pan.baidu.com/s/1_mPT-ZcQ9GU_U1CVhBKpLA提取码:cbey//在vue中安装web3npm install web3 --save//在main.js引入import Web3 from 'web3'Vue.prototype.Web3 = Web3一、唤起Me_如何使用web3和vue.js创建你的第一个以太坊dapp
文章浏览阅读701次。绘制一个太阳花的图形。from turtle import *color("red",'yellow')begin_fill()while True: forward(200) left(170) if abs(pos())<1: breakend_fill()done()_绘制一个直径随机的太阳花
文章浏览阅读348次。Linux常用命令(1)切换到ROOT用户(su - root)[liu@localhost ~]$ su - root密码:[root@localhost ~]查看IP地址(ifconfig)[root@localhost ~]# ifconfigens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.47 netmask 255.255.255.0 broad_code=exited, status=0/success
文章浏览阅读1.3k次。直接上代码:fanweiss(){//画圈varaaa=this.gaojingDatadebuggervarmap=newBMap.Map("ydmap");//创建Map实例varmPoint=newBMap.Point(this.gaojingData.longitude,this.gaojingData.latitude);//中心点map.setMapStyle({style:"midni..._bmap.circle
文章浏览阅读1.4k次。VisualVM原插件地址是oracle的打不开,已经移到github上了,具体如下:介绍:https://visualvm.github.io/plugins.html下载地址:https://visualvm.github.io/pluginscenters.html 选择对应JDK版本下载即可! 注意事项:在使用Visual VM进行heapdump分析的时候,发..._visualvm 插件中心地址
文章浏览阅读8.8k次,点赞15次,收藏80次。understand 常用操作文章目录understand 常用操作简单介绍软件下载常用基本操作新建工程并添加现有文件如何找到自己当前想要去编辑的文件?如何在当前文件中找到你要编辑的函数?如何跳转到定义?查看当前文件的函数列表如何查看函数都被谁调用了?查看函数的调用逻辑如何查找如何找到函数的被调用图除此之外可以分析出代码的各种结构文本的编辑格式设置双屏一边看代码,一遍看代码地图简单介绍understand对分析代码有非常强的能力,完全可以代替sourceinsight,并且可以在linux上mac上使_understand代码