source

glibc의 감가상각 __malloc_hook 기능에 대한 대안

manysource 2023. 9. 17. 13:19

glibc의 감가상각 __malloc_hook 기능에 대한 대안

, 는 C 를 을 를 를 를 는 를 malloc,realloc그리고.freemalloc_functions를 통해 합니다.안타깝게도, 다중 스레드 환경에서는 동작이 좋지 않기 때문에 사용이 권장되지 않습니다.동일한 것을 달성하기 위한 대안적인 모범 사례 솔루션을 설명하는 문서를 찾을 수 없었는데, 누군가 나를 깨우쳐 줄 수 있습니까?

간단한 글을 읽었습니다.#define malloc(s) malloc_hook(s)효과는 있겠지만, 프로파일링/추적 도구에 사용하기에 적합하기에는 원래 코드 기반에 너무 거슬리기 때문에 제가 염두에 둔 시스템 설정에서는 작동하지 않습니다.원래 애플리케이션 코드를 수동으로 변경해야 하는 것은 괜찮은 프로파일러에게는 치명적인 일입니다.최적으로, 선택적 공유 라이브러리에 링크하는 것만으로 내가 찾고 있는 솔루션을 활성화하거나 비활성화해야 합니다.들어 현재 어서과이된을다재된을h다이darn,로 선언된 함수를 사용합니다.__attribute__ ((constructor))를을 malloc갈고리에 갈고리

감사해요.

몇 가지 시도 끝에, 저는 마침내 이것을 어떻게 하는지 알아냈습니다.

에.glibc,malloc취약 기호로 정의되며, 이는 응용 프로그램 또는 공유 라이브러리에서 덮어쓸 수 있음을 의미합니다.이런 이유로,LD_PRELOAD꼭 필요한 것은 아닙니다.대신 공유 라이브러리에 다음과 같은 기능을 구현했습니다.

void*
malloc (size_t size)
{
  [ ... ]
}

에서 에서 하는 입니다 대신 하는 것입니다.glibcs malloc.

이제, , 와와 가 되도록 .__malloc_hook몇 가지 기능은 아직 없어요

1.) 발신자 주소

에 에 합니다 을 합니다 을 에 .malloc,glibcs __malloc_hook는 또한 함수의 합니다. 이 s 의 를 합니다 는 의 반환 주소입니다. 이것은 실제로 어디의 반환 주소입니다.malloc다시 돌아옵니다.동일한 것을 달성하기 위해, 우리는 사용할 수 있습니다.__builtin_return_addressgcc용한능서능g에서 사용할 수 함수.에 다른 컴파일러를 , 로 할 수 있는 :)가에 gcc어서른를지만로할수을는을을요면시런피요i을)가p수면을는할p로c피,,ysegoe)diftcortou :)

우리들의malloc기능은 이제 다음과 같습니다.

void*
malloc (size_t size)
{
  void *caller = __builtin_return_address(0);
  [ ... ]
}

하기 2.)glibc당신의 갈고리안에서 작은 것.

저는 제 어플리케이션에서 glibc에 한정되어 있기 때문에 사용하기로 결정했습니다.__libc_malloc원래의 malloc 구현에 접근할 수 있습니다.면.dlsym(RTLD_NEXT, "malloc")수 , 이 수만할수는이때을가이때을이n는elt,sts 를 사용할 수 있습니다.calloc첫 통화에서, 아마도 Segfault로 이어지는 무한 루프를 초래할 수 있습니다.

완전 말록 훅

이제 내 전체 후킹 기능은 다음과 같습니다.

extern void *__libc_malloc(size_t size);

int malloc_hook_active = 0;

void*
malloc (size_t size)
{
  void *caller = __builtin_return_address(0);
  if (malloc_hook_active)
    return my_malloc_hook(size, caller);
  return __libc_malloc(size);
}

my_malloc_hook다음과 같습니다.

void*
my_malloc_hook (size_t size, void *caller)
{
  void *result;

  // deactivate hooks for logging
  malloc_hook_active = 0;

  result = malloc(size);

  // do logging
  [ ... ]

  // reactivate hooks
  malloc_hook_active = 1;

  return result;
}

, 의 calloc,realloc그리고.free비슷한 일을 하다

동적 및 정적 연결

이러한 기능을 사용하면 동적 연결이 즉시 작동합니다. 호출이 malloc hook하면 .so다든이다l이을gfot든.slt는을oco하면malloc모든 도서관 전화가 내 후크를 통해 전달될 것입니다.정적 링크는 문제가 있습니다.아직 머리를 완전히 감싸진 않았지만 정적 링크 malloc는 약한 기호가 아니므로 링크 시간에 다중 정의 오류가 발생합니다.

예를 들어 디버그 기호를 통해 타사 라이브러리의 함수 주소를 코드 라인으로 변환하는 등 어떤 이유로 정적 링크가 필요하다면 malloc 후크를 동적으로 연결하면서 다중 정의 문제를 피할 수 있습니다.저는 아직 이에 대한 더 나은 해결책을 찾지 못했습니다. 아시는 분은 자유롭게 의견을 내주세요.

다음은 간단한 예입니다.

gcc -o test test.c -lmalloc_hook_library -Wl,-Bstatic -l3rdparty -Wl,-Bdynamic

3rdparty로는됩니다.malloc_hook_library로어과의수가다n가다fls어es는의과e,dmgnd의3rdparty합니다.test꽤 멋지지, 응?

폐색

과 이고 한 합니다 을 은 합니다 을 한 의 은 이고 __malloc_hook 몇 제한이 : s, 인 가 가 인

__builtin_caller_address 와만 .gcc

__libc_malloc 와만 .glibc

dlsym(RTLD_NEXT, [...])는의 GNU입니다의 입니다.glibc

-Wl,-Bstatic그리고.-Wl,-BdynamicGNU binutils에 특화되어 있습니다.

다시 말해, 이 솔루션은 전혀 휴대할 수 없으며 후크 라이브러리를 비GNU 운영 체제로 포팅하려면 대체 솔루션을 추가해야 합니다.

LD_PRELOAD & dlsym http://www.slideshare.net/tetsu.koba/presentations 에서 "Tips for malloc and free" 를 참조하십시오.

Δ Δ NDK Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ __malloc_hook.

https://android.googlesource.com/platform/bionic/+/master/libc/include/malloc.h, esp:에 따르면 Android API v28에서 재인스톨 된 것 같습니다.

extern void* (*volatile __malloc_hook)(size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);

언급URL : https://stackoverflow.com/questions/17803456/an-alternative-for-the-deprecated-malloc-hook-functionality-of-glibc