ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 如何确定哪个动态库负责创建指针?

2019-06-09 19:38:05  阅读:245  来源: 互联网

标签:c-2 c-3 linux dynamic-library shared-objects


假设您有一个使用dlopen()加载多个共享对象/动态库的程序.给定指向全局对象的指针(例如静态成员变量),是否可以确定指针是在哪个库的边界中分配的?

解决方法:

您可以使用文件/ proc / self / maps解析流程图,并查看指针地址的界限,全局变量将位于.data或.bss段中.

示例库lib.c:

static int object;

int *
dummy(void)
{
  return &object;
}

test.c,为简单起见,未处理错误:

#include <stdio.h>
#include <dlfcn.h>
#include <unistd.h>
#include <inttypes.h>
#include <assert.h>
#include <linux/limits.h>

static void which_library(void *p);

int
main(int argc, char **argv)
{
  void *handle;
  void *object;

  handle = dlopen("./lib.so", RTLD_NOW);
  assert(handle);

  object = ((int *(*)(void)) dlsym(handle, "dummy"))();
  which_library(object);
  dlclose(handle);

  return 0;
}

static void
which_library(void *p)
{
  FILE *maps;
  char buffer[49+PATH_MAX+1];

  maps = fopen("/proc/self/maps", "r");
  assert(maps);

  while(fgets(buffer, sizeof(buffer) - 1, maps)) {
    char path[PATH_MAX+1];
    uintptr_t starts;
    uintptr_t ends;

    sscanf(buffer, "%" PRIxPTR "-%" PRIxPTR " %*s %*x %*x:%*x %*d %s", &starts, &ends, path);
    if((uintptr_t)p >= starts && (uintptr_t)p < ends) {
      printf("%p => %s\n", p, path);
      break;
    }
  }

  fclose(maps);
}

测试:

$gcc -Wall -shared lib.c -o lib.so 
$gcc -Wall test.c -ldl
$./a.out 
0xb779f5f8 => /home/barakat/Desktop/lib.so
$

标签:c-2,c-3,linux,dynamic-library,shared-objects
来源: https://codeday.me/bug/20190609/1206880.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有