linux 3.5.4 PTRACE(系列八)

本文介绍如何利用Linux的bfd库编写函数,代替nm命令来提取程序中变量的地址。通过示例代码和编译过程,展示了成功获取变量i地址的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上文中,我们想得到变量i的地址,必须首先运行使用nm命令,我们本文使用linux中的bfd库,自己编写函数来提取变量的地址,代码如下:

list10.c

#include "ptrace.h"
void main(int argc,char *argv[])
{
  long storage_needed,num_symbols,i;
  asymbol **symbol_table;
  bfd *abfd;
  char filename[10];
  bfd_init();
  abfd=bfd_openr(argv[1],NULL);
  assert(abfd!=NULL);
  bfd_check_format(abfd,bfd_object);
  storage_needed=bfd_get_symtab_upper_bound(abfd);
  assert(storage_needed>=0);
    printf("storage=%d\n",storage_needed);
  symbol_table=(asymbol **)malloc(storage_needed);
  num_symbols=bfd_canonicalize_symtab(abfd,symbol_table);
  assert(num_symbols>=0);
   printf("num syms =%d\n",num_symbols);
  for(i=0;i<num_symbols;i++)
    printf("%s:\t\t%p\n",bfd_asymbol_name(symbol_table[i]),bfd_asymbol_value(symbol_table[i]));
}

为了使用linux的bfd库,需要对头文件加以修改,如下所示:

ptrace.h

#include <bfd.h>
#include <assert.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>     /* For struct user_regs_sturct */
#include <sys/syscall.h>    /* For SYS_write etc */
#include <sys/reg.h> /* For constants ORI_EAX etc */
#include <signal.h>
#include <stdio.h> /*for stdio*/

编译方式如下:

#gcc list10.c -o list10.o -liberty -ldl -lbfd

我们运行list1o.o

#./list10.o child4.o

可以得到如下输出;

从这里我们可以看出,程序已经成功将变量i的地址提取出来了。


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值