DYLD_INSERT_LIBRARIES를 사용하여 Mac OS 10.9에서 내 프로그램의 메모리 할당을 무시하고 싶습니다. 이것은 내가 구현 한 코드의 아주 간단한 해골입니다 :Mac OS에서 malloc 무시
void *(*default_malloc)(size_t) = NULL;
void (*default_free)() = NULL;
void *(*default_calloc)(size_t, size_t) = NULL;
void *(*default_realloc)(void *, size_t) = NULL;
void *malloc(size_t size)
{
if(!default_malloc)
{
default_malloc = dlsym(RTLD_NEXT, "malloc");
}
size_t allocSize = size + 16;
char *mem = (char *)default_malloc(allocSize);
malloc_printf("malloc returned %p\n", mem + 16);
return mem + 16;
}
void *calloc(size_t num, size_t size)
{
if(!default_calloc)
{
default_calloc = dlsym(RTLD_NEXT, "calloc");
}
void *p = malloc(num*size);
memset(p, 0, num*size);
malloc_printf("calloc function returned %p\n", p);
return p;
}
void *realloc(void *xp, size_t size)
{
if(!default_realloc)
{
default_realloc = dlsym(RTLD_NEXT, "realloc");
}
char *p = (char *)default_realloc((char *)xp - 16, size + 16);
malloc_printf("realloc function returned %p\n", p + 16);
return p + 16;
}
void free(void *buff)
{
if(buff == NULL)
return;
if(!default_free)
{
default_free = dlsym(RTLD_NEXT, "free");
}
char *mem = buff;
malloc_printf("free function called for %p\n", mem);
default_free(mem - 16);
}
나는 무엇이 잘못되었는지 확실하지 않습니다. 내가 내 프로그램을 실행하면, 나는 다음과 같은 출력을 얻을 :
이$ DYLD_INSERT_LIBRARIES=lib_overrides.dylib ls
ls(2431) malloc: malloc returned 0x7fa6b0400030
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b0400110
ls(2431) malloc: malloc returned 0x7fa6b0400130
ls(2431) malloc: free function called for 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04003c0
ls(2431) malloc: free function called for 0x7fa6b04003e0
ls(2431) malloc: *** error for object 0x7fa6b04003e0: pointer being freed was not allocated
어떻게 free
포인터 0x7fa6b04003e0
셨어요? 로그가 제안하는대로 어디서나 에 의해 반환되지 않습니다. 코드를 여러 번 검토했지만 문제를 찾을 수 없습니다. 어떤 도움이라도 대단히 감사합니다. 친절히 도와주세요.
참고 : 할당 함수에서 16을 더하지 않고 16을 공짜로 빼면 모든 것이 정상적으로 작동합니다. 그렇다면 여기에 오버라이드되지 않는 다른 할당 함수가 있음을 의미합니까? (malloc/calloc/realloc과 별개로)?
그러나 무료로 NULL을 처리했습니다. 또한 libc가 libc보다 먼저로드되어야합니다. 그래서이 함수가 설치되기 전에 어떻게 어떤 것이 할당 될 수 있습니까? – Aarkan
메모리를 필요로하는 모든 것이 malloc을 호출합니다. 예를 들어 strdup. 파일을 열면 메모리가 할당되고 파일을 닫으면 메모리가 해제됩니다. Aand 등등. – gnasher729
https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html을 확인하십시오. – gnasher729