从该共享库中查找加载的共享库的位置?

2024-04-27

从共享库中的函数,在正在运行的进程(用 C 编写)内,我如何发现该共享库是从哪里加载的?

我找到的所有答案都涉及使用诸如ldd在命令行中,或者通过查看/proc/self/maps.

在 Win32 上,我只需使用GetModuleFileName(GetModuleHandle("foo.dll"), szPath, COUNTOF(szPath))。 Linux 的等价物是什么?

额外问题:我在 OS X 中需要相同的信息。


实现此目的的一种方法是使用 dladdr:

共享对象的代码:

$ cat so.c 
#include <stdio.h>
#include <dlfcn.h>
void test_so_func()
{
 Dl_info info;
 if (dladdr(test_so_func, &info))
 {
    printf("Loaded from path = %s\n", info.dli_fname);
 }
 printf("hello\n");
}

主要执行代码:

$ cat test.c
void test_so_func();

int main() {
  test_so_func();
  return 0;
}

生成文件:

$ cat Makefile 
test: test.o libso.so
    gcc test.o -o $@ -Wl,-L.,-lso,-rpath,'$$ORIGIN'

clean:
    -rm -f libso.so test.o test

libso.so: so.c
    gcc -D_GNU_SOURCE=1 -fPIC -shared $< -o $@ -lc -ldl

test.o: test.c
    gcc -fPIC -c $< -o $@

我们来编译一下吧!

$ make
gcc -fPIC -c test.c -o test.o
gcc -D_GNU_SOURCE=1 -fPIC -shared so.c -o libso.so -lc -ldl
gcc test.o -o test -Wl,-L.,-lso,-rpath,'$ORIGIN'

测试这个二进制文件。

$ ./test 
Loaded from path = /spare/scratch/1564054710/libso.so
hello

验证 libso.so 确实说的是实话。

$ ldd ./test
    linux-vdso.so.1 =>  (0x00007ffdf55d5000)
    libso.so => /spare/scratch/1564054710/./libso.so (0x00007fbcc4602000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbcc4238000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbcc4034000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbcc4804000)

这个答案的功劳在于https://github.com/mingwandroid https://github.com/mingwandroid

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从该共享库中查找加载的共享库的位置? 的相关文章

  • 改变 RGB 颜色的色调

    我正在尝试编写一个函数来改变 RGB 颜色的色调 具体来说 我在 iOS 应用程序中使用它 但数学是通用的 下图显示了 R G 和 B 值如何随色调变化 看起来 编写一个函数来改变色调似乎应该是一个相对简单的事情 而不需要对不同的颜色格式进
  • 此上下文中仅支持实体类型、枚举类型或基本类型

    我目前正在开发一个搜索页面 我只需要返回主题的主题详细信息列表 其中包含存储在 int ST 中的所有主题标签 id 目前 ST null true ST Contains b ThemeTagID 行似乎给了我一个错误 附加信息 无法创建
  • 序列化 .NET WCF 服务的类型时出现问题:服务 WSDL 在 XSD 中定义空类型

    我正在使用 WCF 编写一个 Web 服务 我创建了数据合约 我创建了我的服务合同 界面 我定义了方法 其参数的类型与数据契约相同 我实现了创建服务类的服务合同 我使用 svc 文件和 IIS 托管我的服务 我尝试了我的服务 寻找http
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 慢速 WPF 文本框

    我正在开发一个简单的串行数据查看器 它将用于观察传输到计算机串行端口之一的数据 我使用 C 和 WPF 编写了一个测试应用程序 它只是将最近读取的行放入文本块中 但是 它会跳过所有其他行 我的理论是 在 WPF 渲染窗口之前 新数据会被放入
  • 如何在 MSBuild NuGet 包生成的 .nuspec 中注入自定义依赖项

    我正在尝试迁移到使用 MSBuildPack支持使用 csproj 生成项目 NuGet 包 其中在开发过程中使用本地 dll 来构建项目 但在使用 MSBuild 打包 项目时需要替换 交换它们以引用生成的 nuspec 中的外部 NuG
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Datagridview 中为图像列提供超链接

    如何在winforms中超链接到DataGridViewImageColumn OP 评论中的代码示例 DataGridView dgv new DataGridView dgv Name dgv i dgv DataSource dsMa
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • 使用指针隐藏实现(Pimpl 惯用语)

    是否有可能实现以下目标 x hpp 该文件被许多其他类包含 class x impl forward declare class x public methods private x impl impl x cpp 实施 include
  • 在 C 或 C++ 中使用逗号作为宏名称

    我想做这样的事情 define define MAX 10 000 000 undef 有什么技巧可以做到吗 编辑 我知道 C 14 中的数字分隔符 我正在寻找一种技巧来对不兼容的编译器执行相同的操作 EDIT2 请考虑Variadic M
  • 如何使用 Xamarin 应用程序开发自动注销

    我必须在 App xaml cs 上添加功能才能使其正常工作 我在 OnStart 上添加了功能 但现在它会间歇性地一次又一次地将我从应用程序中注销 根据下面的代码 我需要做什么才能让它停止这样做 或者我的代码有问题 这是我最新的代码 na
  • 类型“MyApp”已包含“MystatusBar”的定义

    我的应用程序 XAML
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • 在源代码和预编译二进制文件之间切换

    我们的应用程序中有大量的库 库是用 C 或 C 编写的 平台 net Framework Windows 64 位 将所有内容编译为源代码需要花费大量时间 我们正在考虑切换到预构建的二进制文件 但我们仍然希望保留返回源代码的可能性 作为版本
  • 从 Asp.Net Core 控制器返回 IAsyncEnumerable 和 NotFound

    返回一个控制器操作的正确签名是什么IAsyncEnumerable
  • 如何在 MVC 5 中设置自定义 ClaimsPrincipal?

    我创建了一个自定义主体类 public class FacebookPrincipal ClaimsPrincipal public JObject Data get set 我想用它 当用户登录时 我尝试设置 var fbP new Fa
  • Bazel:为 cc_binary/cc_test 设置运行时环境变量和配置文件位置

    我正在尝试在 Linux 上的 C 应用程序中使用 odbc 以下构建文件用于将库作为外部依赖项包含在内 licenses notice cc library name lib srcs lib libodbc so lib64 libod
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec

随机推荐

  • 可以用html渲染图像吗?

    我可以控制从文本文件获取 html 并在网页中呈现该 html 的页面 现在它必须在某处添加图像并引用该图像 src 我想知道我们是否可以与其他 html 代码一起渲染图像 这可能吗 是的 你需要一个数据 URI 方案 http en wi
  • Python 元类有什么用?

    元类可以用其他方式做不到的事情做什么 Alex Martelli 表示 有些任务如果没有元类就无法完成Python 元类与类装饰器 https stackoverflow com questions 1779372 python metac
  • Openfire 在用户离线时发送推送通知

    我使用 openfire 3 9 3 服务器和 Android 和 IOS 作为客户端 我想在收件人用户离线时通过推送通知向两个客户端发送消息 当发送推送时 发送者应该收到消息收据 为此 我尝试过 制作拦截器 在此 我没有收到任何可以跟踪的
  • R rvest 检索空表

    我正在尝试两种策略来从网络表中获取数据 library tidyverse library rvest webpage lt read html https markets cboe com us equities market stati
  • 在iOS中,在纯C中,这是获取本地文件路径的方法吗?

    我需要最终得到一个 cstring 作为捆绑包中文件的本地路径 First include
  • Laravel updateOrCreate 带有自动增量数据库

    我的目的是如果值存在则更新 否则插入新行提交表单后在数据库表中 问题是 这里的函数添加新列在数据库表中而不是更新它们 这是我的功能 MyModel updateOrCreate array myField gt myValue gt whe
  • 如何同时将单个卷挂载到多个/var/lib/docker?

    可以将单个 docker 卷共享给多个 docker 容器 var lib docker目的地 一个最小的可重现示例如下 docker volume create name lib docker run privileged v lib v
  • Primefaces 问题:使用 ViewScoped 托管 bean 从 p:datatable 进行 p:filedownload

    使用 ViewScoped 托管 bean 从 p datatable 进行 p filedownload 不起作用 它调用方法prepareFile和getFile两次 在我提到的方法的第一次调用中 它设置表中的第一个文件 在方法的第二次
  • ZipInputStream.getNextEntry() 如何工作?

    假设我们有这样的代码 File file new File zip1 zip ZipInputStream zis new ZipInputStream new FileInputStream file 假设您有一个包含以下内容的 zip
  • 如何检查 Google 地图是否已完全加载?

    我正在将 Google 地图嵌入到我的网站中 加载 Google 地图后 我需要启动一些 JavaScript 进程 有没有办法自动检测 Google 地图何时完全加载 包括图块下载等 A tilesloaded 存在应该完全完成此任务的方
  • 使用 CURL post 方法的 Google 翻译 API

    有人有过使用 Google 翻译 API v2 在 POST 方法上使用 PHP CURL 翻译 HTML 的经验吗 我已经尝试了 github 上的几个代码和库 但没有一个适合我 我发现的是 GET 方法 由于通过 GET 或查询字符串解
  • 在测试中检查 CLI 的退出代码

    我正在为命令行工具编写自动化测试 本质上 我想使用各种选项调用 CLI 并测试退出代码和 或输出 我的测试如下所示 from mymodule cli tool import main def test args capfd with py
  • Heroku 缺少必需的标志:-a,

    我目前正在做一个项目 但我在使用 Heroku 时遇到了问题 这是当我尝试使用 heroku 命令时总是出现的错误 问题中的错误 https i stack imgur com bEQ0m png 请问有同样错误的朋友 可能是什么原因造成的
  • Golang xml.Unmarshal 接口类型

    使用xml我在解组非同质类型列表时遇到问题 考虑以下 XML 文档 其嵌套元素是非同质类型的列表
  • py2exe + sqlalchemy + sqlite 问题

    在进入全速开发模式之前 我正在尝试让一些基本的东西在 Python 中工作 具体如下 Python 2 5 4 PyQt4 4 4 3 SqlAlchemy 0 5 2 py2exe 0 6 9 setuptools 0 6c9 pysql
  • String 对象上的“tap”方法未返回预期结果

    在对 String 类型的对象使用 tap 方法时 我遇到了一个有趣的问题 abc tap o o xyz this line returns abc instead of xyz tap 方法适用于其他类型的对象 tap o o lt l
  • 将自定义路由添加到 Rails 应用程序

    我已经读过导轨指南 http guides rubyonrails org routing html 我想要设置的是路由到 配置文件 控制器的以下路由 GET profiles charities 应显示所有慈善机构 GET profile
  • 在 SQL 中查找日期范围重叠的记录

    我有以下表格和数据 CREATE TABLE customer wer id customer NUMBER name VARCHAR2 10 surname VARCHAR2 20 date from DATE date to DATE
  • 验证 PDF 文档中的数字签名

    我正在尝试验证 PDF 数字签名 我知道 当 PDF 被签名时 会定义一个字节范围 嵌入证书 并且根据我的阅读 签名的消息摘要和时间戳也存储在 PDF 中 我已经可以提取证书并验证它们 现在我正在尝试验证 pdf 的完整性 但我的问题是我不
  • 从该共享库中查找加载的共享库的位置?

    从共享库中的函数 在正在运行的进程 用 C 编写 内 我如何发现该共享库是从哪里加载的 我找到的所有答案都涉及使用诸如ldd在命令行中 或者通过查看 proc self maps 在 Win32 上 我只需使用GetModuleFileNa