当前位置: 首页 > news >正文

上海建设工程造价网站北京中小型网站建设

上海建设工程造价网站,北京中小型网站建设,服务好的网站制作建设,企业策划文案论文用gdb调试程序时#xff0c;一般的函数都可以step进去#xff0c;可是C库函数却直接跳过了。 网上找了些资料#xff0c;记录一下#xff01; 1.安装C库的debug版本 [plain] view plaincopy print?sudo apt-get install libc6-dbg 安装完后#xff0c;在/usr/lib目录下… 用gdb调试程序时一般的函数都可以step进去可是C库函数却直接跳过了。 网上找了些资料记录一下 1.安装C库的debug版本 [plain] view plaincopy print? sudo apt-get install libc6-dbg   安装完后在/usr/lib目录下会多出一个debug目录里面有安装的debug版c库的动态链接文件 2.编译程序使用debug版本C库 例如程序test.c使用如下命令编译。 [html] view plaincopy print? gcc -g -Wall test.c -o test -Wl,-rpath/usr/lib/debug   可以使用ldd test来查看是否使用了debug版c库。我们可以比较前后的信息 使用debug版C库输出的信息 [plain] view plaincopy print? linux-gate.so.1   (0x00b65000)   libc.so.6  /lib/i386-linux-gnu/libc.so.6 (0x00c94000)   /lib/ld-linux.so.2 (0x00872000)   未使用debug版C库输出的信息[plain] view plaincopy print? linux-gate.so.1   (0x00fa9000)   libc.so.6  /lib/i386-linux-gnu/libc.so.6 (0x001af000)   /lib/ld-linux.so.2 (0x0054a000)   可以看出成功了 3.调试 [plain] view plaincopy print? gdb test   进入gdb后在相应位置下断点运行到该位置后使用s发现能进入c库但是找不到c库源码呵呵 原来还要下载对应版本的c库源码。如何查看c库版本呢 使用如下命令 [plain] view plaincopy print? ll /usr/lib/debug/i386-linux-gnu/libc*   知道了对应的版本后去glibc官网去下载吧http://ftp.gnu.org/gnu/glibc/ 有了源码在gdb中用directory命令指定对应文件所在目录调试时即可看到源码。参考链接 http://blog.csdn.net/summerhust/article/details/5966751 时间: 2015-11-12 10:38:00 最近在研究动态链接原理这块想通过GDB跟踪动态链接器ld-Linux.so.2是如何工作的发现Ubuntu提供的/usr/lib/debug并不能很好的工作跟踪进去后发现源码不是对不上就是错误的所以萌发了自己编译C库的想法以下是我的操作记录欢迎指正。 开始前需要确保你的磁盘剩余空间不小于3G空间你不会想到编译调试版本的C库需要这么大的磁盘空间。 首先下载源码我的系统是Ubuntu 15.10使用sudo apt-get source libc6-dbg下载的C库版本是glibc-2.21。我的源码目录是~/libc-dbg/glibc-2.2.1。 在INSTALL编译安装说明中说C库不能在源码目录安装所以我在home目录下新建立了一个目录用于编译C库目录为~/libc。又建立了一个~/lib目录用于最后的C库安装目录。 好进入~/libc输入../libc-dbg/glibc-2.21/configure --prefix/home/astrol/lib CFLAGS-O1 -g3 -ggdb CXXFLAGS-O1 -g3 -ggdb --disable-werror 注意我为了调试所以加了-g3 -ggdb调试选项-Ox是必须得因为C库必须要指定还有最后的--disable-werror也是必须得否则会将编译过程中的很多警告信息归为错误那么就没法继续编译了。这里我只是根据我自身的要求加的几个选项你也可以根据自己的需求自行添加参考../libc-dbg/glibc-2.21/configure --help的提示帮助。 根据上面命令的结果提示看能否通过如果不行就尽量想办法满足它比如在configure过程中提示我系统需要gawk那么我就sudo apt-get install gawk来满足它就OK了。 到了这里就开始编译吧键入make接下来就等吧要很久的。 最后make install就将编译好的库安装到我指定的~/lib中。 进入~/lib哬文件还真多咦怎么没有生成的库呢仔细一看原来所有的库都在子目录lib下: 这些都是带有符号信息的动态库。 好了我们写个hello world看如何使用它们。 gcc -g -o hello hello.c 然后ldd hello输出如下 linux-gate.so.1  (0xb7732000)         libc.so.6 /lib/i386-linux-gnu/libc.so.6 (0xb7563000)         /lib/ld-linux.so.2 (0x80080000) 看来这样编译不行根本没用上我编译好的哪些库改变编译参数 gcc -Wl,-rpath,/home/astrol/lib/lib -Wl,--dynamic-linker,/home/astrol/lib/lib/ld-linux.so.2 -g -o hello hello.c 或者gcc -Wl,-rpath/home/astrol/lib/lib -Wl,--dynamic-linker/home/astrol/lib/lib/ld-linux.so.2 -g -o hello hello.c其实都是一样的。 再ldd hello输出如下 linux-gate.so.1  (0xb7732000)         libc.so.6 /home/astrol/lib/lib/libc.so.6 (0xb758a000)         /home/astrol/lib/lib/ld-linux.so.2 /lib/ld-linux.so.2 (0x8001d000) 看来OK了我们再使用readelf确认下使用readelf --program-headers hello输出 Elf file type is EXEC (Executable file) Entry point 0x8048340 There are 9 program headers, starting at offset 52 Program Headers:   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align   PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4   INTERP         0x000154 0x08048154 0x08048154 0x00023 0x00023 R   0x1       [Requesting program interpreter: /home/astrol/lib/lib/ld-linux.so.2]   LOAD           0x000000 0x08048000 0x08048000 0x005f4 0x005f4 R E 0x1000   LOAD           0x000f00 0x08049f00 0x08049f00 0x00120 0x00124 RW  0x1000 看来都可以了。 现在使用gdb调试我们的hello。gdb hello -q进入调试。使用set verbose on打开gdb信息打印可以更好的看到调试信息。 astrolastrol:~/test$ gdb hello -q Reading symbols from hello...done. (gdb) set verbose on (gdb) start Temporary breakpoint 1 at 0x804843c: file hello.c, line 5. Starting program: /home/astrol/test/hello Reading symbols from /home/astrol/lib/lib/ld-linux.so.2...done. Reading symbols from system-supplied DSO at 0xb7fdd000...(no debugging symbols found)...done. Reading in symbols for dl-debug.c...done. Reading in symbols for rtld.c...done. Reading symbols from /home/astrol/lib/lib/libc.so.6...done. Temporary breakpoint 1, main () at hello.c:5 5               printf(hello world\n); (gdb) gdb成功加载了两个库和它们的符号信息。那么接下来的调试就能很好的继续了。这里我演示下printf的工作过程观察下PLT的大致工作过程。 (gdb) disassemble /m Dump of assembler code for function main: 4       {    0x0804842b 0:     lea    0x4(%esp),%ecx    0x0804842f 4:     and    $0xfffffff0,%esp    0x08048432 7:     pushl  -0x4(%ecx)    0x08048435 10:    push   %ebp    0x08048436 11:    mov    %esp,%ebp    0x08048438 13:    push   %ecx    0x08048439 14:    sub    $0x4,%esp 5               printf(hello world\n); 0x0804843c 17:    sub    $0xc,%esp    0x0804843f 20:    push   $0x80484e0    0x08048444 25:    call   0x8048300 putsplt    0x08048449 30:    add    $0x10,%esp 6               return 0;    0x0804844c 33:    mov    $0x0,%eax 7       }    0x08048451 38:    mov    -0x4(%ebp),%ecx    0x08048454 41:    leave    0x08048455 42:    lea    -0x4(%ecx),%esp    0x08048458 45:    ret End of assembler dump. 地址0x8048300就是puts的PLT入口处。跟踪进去 (gdb) disassemble /m 0x8048300 Dump of assembler code for function putsplt:    0x08048300 0:     jmp    *0x804a00c    0x08048306 6:     push   $0x0    0x0804830b 11:    jmp    0x80482f0 End of assembler dump. 继续跟进最后jmp到0x80482f0可以通过x命令看到0x80482f0处的指令如下 (gdb) x/3i $eip 0x80482f0:   pushl  0x804a004    0x80482f6:   jmp    *0x804a008    0x80482fc:   add    %al,(%eax) 继续jmp到*0x804a008这就是_dl_runtime_resolve函数的地址它是最终进入_dl_fixup函数的“跳板”。继续跟进看最后进入_dl_fixup函数后效果如何。 最终进入_dl_fixup函数后发现是很正常的gdb能很好的进行源码级调试不会出现Ubuntu提供的/usr/lib/debug出现的哪些情况了即行号和源码是一一对应的。 好了本文就到此结束吧。
http://www.yutouwan.com/news/214895/

相关文章:

  • 58同城网站模板下载做网站和淘宝美工 最低电脑
  • 服装网站建设前景分析建筑师网站有哪些
  • 中国住建部网站官网数据中台主要实现哪些功能
  • 魔都网站建设seo网站优化服务
  • 怎么在微信做企业网站模板网站平台
  • 上海建设银行营业网站湛江手机网站建设公司
  • 怎么用ps做购物网站怎样弄微信公众号
  • 自己做的网站怎样让百度搜到合肥建设云个人服务平台
  • django 做的网站wordpress控制台改主题代码
  • 房产网签合同平台郑州seo野狼
  • 免费邯郸网站建设虾皮跨境电商网站
  • 做论坛网站 备案吗html代码网站
  • 柳州做网站的企业在建设官网的公司做运营
  • 娱乐城网站模板网站建设丿金手指专业
  • 关于继续做好网站建设得通知网页设计师培训教程
  • 建设银行宁夏分行网站甘肃手机版建站系统哪个好
  • 烟台网站建设 熊掌号有哪些网站可以做淘宝客
  • 网站建设友汇最新国际新闻
  • 找个网站这么难2021九讯鹿网站建设
  • 京东电子商务网站的建设企业网站的建设企业
  • 未来做哪些网站能致富软装设计用什么软件
  • 网站建设毕业答辩问题wordpress搭建门户
  • 全球采购网站接工程的app软件
  • 大连信联科技做的网站怎么样网上电商平台开发
  • 建设部网站危险性较大怎么免费创建网址
  • 河南省建设监理协会网站人才十企业年金险是什么意思
  • 商业网站设计与制作论文有哪些做问卷调查挣钱的网站
  • 福建省中嘉建设工程有限公司网站手机网站建设网站报价
  • 网站没有关键词的弊端郫都区网站建设
  • 一个人可以备案几个网站网站建设款分录