tcmalloc: ¿cómo puedo conseguir mis llamadas malloc anulados al compilar estáticamente?

StackOverflow https://stackoverflow.com/questions/1553435

  •  20-09-2019
  •  | 
  •  

Pregunta

Cuando uso LD_PRELOAD=/usr/local/lib/libtcmalloc.so, todas las llamadas a malloc convierten tcmalloc llamadas. Sin embargo, cuando me enlace dinámico con libtcmalloc, encuentro que malloc recta se está llamado a no ser que todavía utilizo el ajuste LD_PRELOAD.

Entonces, ¿cómo puedo compilar estáticamente contra tcmalloc de tal manera que mis mallocs enganchan en tcmalloc?

Notas:

  • estoy usando un montón de C ++ nuevo etc, por lo simplemente #defining malloc a tcmalloc no funcionará
  • Posiblemente tengo que usar malloc_hook mí mismo, pero me gustaría tener pensé que podría llegar a hacerlo tcmalloc para mí, ya que claramente lo está haciendo cuando se enlaza dinámicamente
¿Fue útil?

Solución

Los símbolos se resolvieron en una primera base de fósforo. Es necesario asegurarse de que se busca libtcmalloc.a antes libc.a por el enlazador. Asumo que no está vinculando explícitamente libc.a ya que normalmente no es necesario hacerlo. La solución es especificar -nostdlibs, y luego vincular explícitamente todas las librerías necesarias en el orden que desee que se buscaron. Por lo general, algo como:

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc

Otra solución que puede ser más simple, es vincular el archivo (s) de objetos necesarios para resolver tcmalloc en lugar de la biblioteca estática, ya que los archivos de objetos tienen prioridad sobre las bibliotecas en la resolución de símbolos.

Otros consejos

TCMalloc anula todas las llamadas a la función de asignación / desasignación, incluyendo todas las variantes de Nueva / eliminar , y la API de C ( malloc / libre / calloc / realloc / valloc / pvalloc / mem_aligned / malloc_usable_size ) Para las plataformas con base gcc, se consigue la anulación directiva using alias.

  

estoy usando un montón de C ++ nuevo etc, por lo que sólo #defining malloc a tcmalloc no funcionará

En las cabeceras TCMalloc, malloc es ya un alias a tc_malloc , así que esto no tiene ningún efecto. Por ejemplo:

#define ALIAS(tc_fn)   __attribute__ ((alias (#tc_fn), used))
void* malloc(size_t size) __THROW               ALIAS(tc_malloc)

Nueva , tenga en cuenta que a diferencia de glibc y otra aplicación de Nueva (ventanas), que acaba de Wrapps malloc, Nuevo tcmalloc no llama a malloc.

TCMalloc Nueva es alias a tc_new y tc_newarray , que será el encargado de llamada de memoria "mágica" de TCMalloc, y en algunos casos, como libc malloc, iniciará una llamada al sistema sbrk / BRK.

Otra cosa que hay que hacer es asegurarse de gcc no se vincula con las variantes malloc de libc. Para ello, por favor agregue a Banderas C ++ en el Makefile lo siguiente:

-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free

Además, no olvide especificar biblioteca estática TCMalloc:

LIB_TCMALLOC = $(TCMALLOC_LIB_DIR)/libtcmalloc_minimal.a
LIB_DIR := .... -L$(TCMALLOC_LIB_DIR) ...
LIBS := ... -static $(LIB_TCMALLOC) ...
  

Posiblemente tengo que usar malloc_hook mí mismo, pero yo habría pensado que podría conseguir tcmalloc que lo haga por mí, ya que claramente lo está haciendo cuando se enlaza dinámicamente

TCMalloc no utiliza malloc_hooks, que es por ahora se considera obsoleta debido a cuestiones de seguridad hilo. Simplemente utiliza el hecho de que los métodos de asignación de memoria son símbolos débiles. Se anula esos símbolos ya sea el uso de alias (en gcc) __attribute__((alias)) de por llamadas de función.

Por favor, consulte: https://github.com/gperftools/gperftools/blob/master/README

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top