OSX Mavericks 上的函数插入 [英] Function Interposing on OSX Mavericks

查看:84
本文介绍了OSX Mavericks 上的函数插入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我完全按照本网站上的说明进行操作

I followed the directions exactly as they are on this site here

http://www.newosxbook.com/src.jl?tree=listings&file=4-5-interpose.c

这是该页面的代码

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <malloc/malloc.h> // for malloc_printf()

// Note: Compile with GCC, not cc (important)
//
//
// This is the expected interpose structure
 typedef struct interpose_s { void *new_func;
                   void *orig_func; } interpose_t;
// Our prototypes - requires since we are putting them in 
//  the interposing_functions, below

void *my_malloc(int size); // matches real malloc()
void my_free (void *); // matches real free()

static const interpose_t interposing_functions[] \ 
    __attribute__ ((section("__DATA, __interpose"))) = {

 { (void *)my_free, (void *)free },
 { (void *)my_malloc, (void *)malloc } 

};

void *
my_malloc (int size) {
 // In our function we have access to the real malloc() -
 // and since we don’t want to mess with the heap ourselves,
 // just call it
 //
void *returned = malloc(size);
// call malloc_printf() because the real printf() calls malloc()
// // internally - and would end up calling us, recursing ad infinitum

  malloc_printf ( "+ %p %d\n", returned, size); return (returned);
}
void
my_free (void *freed) {
// Free - just print the address, then call the real free()


  malloc_printf ( "- %p\n", freed); free(freed);
}



#if 0
  From output 4-11:

 morpheus@Ergo(~)$ gcc -dynamiclib l.c -o libMTrace.dylib -Wall  // compile to dylib
 morpheus@Ergo(~)$ DYLD_INSERT_LIBRARIES=libMTrace.dylib ls     // force insert into ls
 ls(24346) malloc: + 0x100100020 88
 ls(24346) malloc: + 0x100800000 4096
 ls(24346) malloc: + 0x100801000 2160 
 ls(24346) malloc: - 0x100800000 
 ls(24346) malloc: + 0x100801a00 3312 ... // etc.

#endif

最新版本的 OSX 或此处编写的代码有什么不同吗?它似乎没有拦截任何东西.

Is there something different about the latest version of OSX or the code written here? It did not seem to intercept anything.

推荐答案

这不是 Mavericks 的特性,而是 clang 的特性.如果您使用 jtool ,在同一网站上,您会看到生成的 dylib 没有 _DATA._interpose,这是 DYLD 发挥插入魔法所必需的.

It's not a feature of Mavericks, it's a feature of clang. If you use jtool , from the same website, you'll see the generated dylib has no _DATA._interpose, which is required for DYLD to work the interposition magic.

顺便说一句,最好在该书自己的论坛中提出这个问题.这可能就是它的用途.

Incidentally, this question is best asked in that book's own forum. That's probably what it's there for.

这篇关于OSX Mavericks 上的函数插入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆