首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mac上的dl_iterate_phdr等效项

Mac上的dl_iterate_phdr等效项
EN

Stack Overflow用户
提问于 2012-04-04 10:08:14
回答 2查看 1.6K关注 0票数 4

我希望遍历所有已加载的共享库,并获取它们的基地址和文件名。这基本上是Linux上的dl_iterate_phdr

但我也想为Mac做同样的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-04 10:32:22

dyld(3)手册页(似乎不再联机)中记录的函数似乎提供了类似的功能。

以下是这些内容:

名称

_dyld_image_count、_dyld_get_image_header、_dyld_get_image_vmaddr_slide、_dyld_get_image_name、_dyld_register_func_for_add_image、_dyld_register_func_for_remove_image、NSVersionOfRunTimeLibrary、NSVersionOfLinkTimeLibrary _NSGetExecutablePath

提要

#include uint32_t _dyld_image_count(空);const struct mach_header* _dyld_get_image_header(uint32_t image_index);intptr_t _dyld_get_image_vmaddr_slide(uint32_t image_index);const char* _dyld_get_image_name(uint32_t image_index);void _dyld_register_func_for_add_image(void (*func)(const struct mach_header* mh,intptr_t vmaddr_slide));void _dyld_register_func_for_remove_image(void (*func)(const struct mach_header* mh,intptr_t vmaddr_slide));int32_t NSVersionOfRunTimeLibrary(const char* libraryName);int32_t NSVersionOfLinkTimeLibrary(const char* libraryName);int _NSGetExecutablePath(char* buf,uint32_t* bufsize);

描述

除了dlopen()dladdr()提供的功能之外,这些例程还提供了对dyld的额外自检

_dyld_image_count()返回dyld映射的当前图像数。请注意,使用此计数来迭代所有图像不是线程安全的,因为在迭代期间,另一个线程可能正在添加或删除图像。

_dyld_get_image_header()返回一个指针,指向由image_index索引的图像的mach头。如果image_index超出范围,则返回NULL。

_dyld_get_image_vmaddr_slide()返回由image_index索引的图像的虚拟内存地址滑动量。如果image_index超出范围,则返回零。

_dyld_get_image_name()返回由image_index索引的图像的名称。C字符串仍归dyld所有,不应删除。如果image_index超出范围,则返回NULL。

_dyld_register_func_for_add_image()注册在程序中添加新映像(包或动态共享库)时要调用的指定函数。当第一次注册此函数时,将为当前进程中的每个图像调用一次。

当从进程中删除映像(包或动态共享库)时,_dyld_register_func_for_remove_image()注册要调用的指定函数。

NSVersionOfRunTimeLibrary()返回libraryName指定的当前加载的dylib的current_version号。libraryName参数对于/path/libbar.3.dylib是"bar“,对于/path/Foo.framework/Versions/A/Foo是"Foo”。如果没有加载这样的库,则此函数返回-1。

NSVersionOfLinkTimeLibrary()返回主可执行文件在构建时所链接的current_version编号。libraryName参数对于/path/libbar.3.dylib是"bar“,对于/path/Foo.framework/Versions/A/Foo是"Foo”。如果主可执行文件没有链接到指定的库,则此函数返回-1。

_NSGetExecutablePath()将主可执行文件的路径复制到缓冲区buf中。bufsize参数最初应为缓冲区的大小。如果路径复制成功,则此函数返回0,而* bufsize保持不变。如果缓冲区不够大,则返回-1,并将* bufsize设置为所需的大小。请注意,_NSGetExecutablePath()将返回可执行文件的“路径”,而不是可执行文件的“实际路径”。也就是说,路径可以是符号链接,而不是真正的文件。对于深度目录,所需的总bufsize可能超过MAXPATHLEN

票数 4
EN

Stack Overflow用户

发布于 2012-04-07 10:22:39

只是为了完成:

输入是指向一些静态内容(例如函数)的任何指针,目标是找到库及其部分。

我在ptr_is_in_exe函数中实现了这个here

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static bool
ptr_is_in_exe(const void *ptr, const struct mach_header *& header, intptr_t& offset, uintptr_t& vmaddr, std::string& image_name)
{
    uint32_t i, count = _dyld_image_count();

    for (i = 0; i < count; i++) {
        header = _dyld_get_image_header(i);
        offset = _dyld_get_image_vmaddr_slide(i);

        uint32_t j = 0;
        struct load_command* cmd = (struct load_command*)((char *)header + sizeof(struct mach_header));
        if(header->magic == MH_MAGIC_64)
            cmd = (struct load_command*)((char *)header + sizeof(struct mach_header_64));

        while (j < header->ncmds) {
            if (cmd->cmd == LC_SEGMENT) {
                struct segment_command* seg = (struct segment_command*)cmd;
                if (((intptr_t)ptr >= (seg->vmaddr + offset)) && ((intptr_t)ptr < (seg->vmaddr + offset + seg->vmsize))) {
                    vmaddr = seg->vmaddr;
                    image_name = _dyld_get_image_name(i);
                    return true;
                }
            }
            if (cmd->cmd == LC_SEGMENT_64) {
                struct segment_command_64* seg = (struct segment_command_64*)cmd;
                if (((uintptr_t)ptr >= (seg->vmaddr + offset)) && ((uintptr_t)ptr < (seg->vmaddr + offset + seg->vmsize))) {
                    vmaddr = seg->vmaddr;
                    image_name = _dyld_get_image_name(i);
                    return true;
                }
            }

            j++;
            cmd = (struct load_command*)((char*)cmd + cmd->cmdsize);
        }
    }

    return false;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10009043

复制
相关文章
等效直径
算法:等效直径是与轮廓面积相等的圆形的直径,作为轮廓的特征,也作为图像的特征,通常情况下,轮廓是非规则外形的图像。
裴来凡
2022/05/28
8590
等效直径
电阻电路的等效变化(Ⅰ)
欧姆定律:在同一电路中,通过某一导体的电流跟这段导体两端的电压成正比,跟这段导体的电阻成反比,这就是欧姆定律。公式为I=U/R 基尔霍夫定律:在前面的电路当中有介绍过的,概述:集总参数电路:集总参数思想是电路理论的最基本也是最核心的思想 。集总参数电路是由电路电气器件的尺寸和工作信号的波长来做标准划分的,要知道集总参数电路首先要了解实际电路的基本定义。实际电路有可分为分布参数电路和集总参数电路。基尔霍夫电流定律(KCL)  基尔霍夫电压定律(KVL) 等效变化:本篇内容的重点也是在学习电路当中必须要掌握的知识点,对电路在进行分析和计算的时候有的时候可以把某一部分的电路是可以进行化简的。那么此时就可以用较为难的一个电路化简成一个比较简单的电路。 这③个概念对于前期来说学电路是特别的重要的(✿◕‿◕✿)
謓泽
2022/12/12
5360
电阻电路的等效变化(Ⅰ)
电阻电路的等效变化(Ⅱ)
🚩write in front🚩    🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家 & 阿里云星级博主~掘金⇿InfoQ创作者~周榜99»总榜1184🏅 🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠  📝个人主页-謓泽的博客_CSDN博客📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏-【电路】原理_謓泽的博客-CSDN博客🎓 ✉️我们并非登
謓泽
2022/12/12
6050
电阻电路的等效变化(Ⅱ)
电阻电路等效变换(Ⅲ)
🚩write in front🚩   🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ创作者~周榜163﹣总榜1039⇿全网访问量30w+🏅 🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠ 📝个人主页⇢打打酱油desuCSDN博客💬 🎁欢迎各位⇢点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏⇢【电路】原理_謓泽的博客-CSDN博
謓泽
2022/12/12
6060
电阻电路等效变换(Ⅲ)
Mac上ADB的使用
adb bugreport : 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误
码客说
2019/10/22
2.6K0
MHA安装及等效性配置
    MHA由MHA节点(可以理解为子节点)及MHA管理节点2部分组成。因此对于MHA的安装,相应的也分为2个部分,即安装MHA节点,安装MHA管理节点。本文基于CentOS 5.9 64bit简要描述了MHA的安装,同时也描述了在配置MHA时需要完成的等效性配置。供大家参考。
Leshami
2018/08/13
6680
更改Mac上的文件关联
最近更新了coda,结果原先跟coda关联的文件变成了跟DW关联了,真是“墙头草”。找了很久不没找到在哪更改关联程序,最后终于搜到啦,比windows还要简单,直接在文件属性里就可以修改了,操作如下:
GhostZhang
2022/08/21
1.6K0
Mac上开发常用的操作
但是这样系统重启后就失效了 永久生效的方法是编辑~/.bashrc文件,每行加入一个alias命令
码客说
2019/10/22
4990
phabricator在mac上的搭建
前提:phabricator主要是由php写的,而且是以website方式运行的,所以mac上要先安装好 php + nginx(或apache) + mysql(很多配置会保存在数据库里)
菩提树下的杨过
2018/09/20
1.8K0
phabricator在mac上的搭建
Q4单元的等效节点力
在划分单元时,应尽可能将集中力作用点作为节点,该集中力即为节点荷载。这样就不必对其进行额外处理。分布荷载转移到单元节点上必须遵循静力等效原则。
fem178
2020/05/18
1.2K0
【Android】设置透明、半透明等效果
View v = findViewById(R.id.content);//找到你要设透明背景的layout 的id
易寒
2021/12/22
3.6K0
mac上获取手机的uuid
把手机连上mac 终端中输入: system_profiler SPUSBDataType | grep "Serial Number:.*" 修改用 | sed s#".*Serial Number: "##
周希
2019/10/15
1.5K0
mac上安装influxdb
ln -sfv /usr/local/opt/influxdb/*.plist ~/Library/LaunchAgents
半条命专刊
2020/09/14
2.8K0
mac上安装软件_mac 安装软件
Mac下面除了用dmg、pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样。MacPorts就像apt-get、yum一样,可以快速安装些软件。
全栈程序员站长
2022/11/08
2K0
MAC上打包python
pyinstaller --windowed --onefile --clean --noconfirm target.py
py3study
2020/01/06
9740
Mac上Nginx安装
Mac上安装Nginx需要Homebrew环境支持,所以第一步先安装Homebrew。
用户6094182
2020/04/30
2.7K0
Mac上Nginx安装
mac 上安装Protobuffer
Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。现阶段支持C++、JAVA、Python等三种编程语言。
solate
2019/07/19
3.5K0
Mac上node安装
brew方式安装 安装homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 可能会遇到没有文件写入权限的问题,加上权限就好,类似于这样的: sudo chmod -R g+w /usr/local/Homebrew 安装node brew install node 等待安装完成即可 nvm安装方式 安装nvm # script curl -o- h
糊糊糊糊糊了
2018/07/04
8210
Mac上更新Ruby
在项目中要适配iOS10,要使用cocoapods更新第三方库,而目前使用的ruby版本是Mac系统自带的1.8.7。所以需要对ruby进行升级。这里使用rvm对ruby进行升级,升级过程如下: 1、安装 rvm rvm:Ruby Version Manager,Ruby版本管理器,包括Ruby的版本管理和Gem库管理(gemset)。
s_在路上
2018/09/11
3.4K0
Mac上更新Ruby
点击加载更多

相似问题

Mac上的UICollectionView等效项

310

Mac上的PostThreadMessage等效项

11

Mac上的IIS等效项

16

Mac GridView等效项

21

UIBarButtonSystemItemAction的Mac等效项

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文