Глобально использовать malloc Google?

Я хотел бы поэкспериментировать с tcmalloc от Google в Linux... У меня здесь огромный проект с сотнями файлов Makefile, сгенерированных qmake... Я хотел бы найти способ заставить gcc глобально связываться с tcmalloc (как это делает с libc)... Возможно ли это? Или мне придется редактировать каждый Makefile?

(Я бы предпочел не редактировать все pro-файлы, так как их сотни)

(Кроме того, мы уже пробовали метод LD_PRELOAD, и он работает не совсем правильно)...


person dicroce    schedule 22.10.2009    source источник
comment
Разве вы не можете просто отредактировать файлы .pro qmake?   -  person liori    schedule 23.10.2009
comment
Можете ли вы дать больше информации о том, что LD_PRELOAD работает неправильно? Что именно вы испытываете, когда пытаетесь использовать LD_PRELOAD?   -  person R Samuel Klatchko    schedule 23.10.2009
comment
Ну, похоже, что только часть приложения использовала tcmalloc... Огромные участки его allocs НЕ направлялись в tcmalloc... Я пытался использовать ltrace, чтобы проверить это, но ltrace довольно быстро рухнул (кстати, ltrace показывал только вызовы в qt, а tcmalloc также сгенерировал только отчет, показывающий код qt... однако, в этом приложении вызывается malloc гораздо больше)...   -  person dicroce    schedule 23.10.2009
comment
stackoverflow.com/questions/1553435/   -  person slf    schedule 23.10.2009
comment
-nostdlibs интересен, но мне нужен какой-то способ сделать это глобально, иначе я вернусь к редактированию сотен make-файлов или файлов .pro...   -  person dicroce    schedule 23.10.2009


Ответы (2)


Как ваши make-файлы получают доступ к компилятору (gcc/g++/cc/c++)?

Если это просто имя (g++), а не явный путь (/usr/bin/g++), вы можете просто создать замену g++ в любом удобном для вас каталоге, и добавьте этот каталог к ​​вашему пути.

Например: создайте файл ~/mytmpgccdir/g++:

#!/bin/tcsh -f
exec /usr/bin/g++ -Lfoo -lfoo $*:q

Добавляйте любые дополнительные элементы (-Lfoo -lfoo), которые вам нравятся, до или после других аргументов ($*:q).

Затем предварительно добавьте его к своему пути и сделайте нормально.

#tcsh version
% set path = ( ~/mytmpgccdir/  $path:q )
% make clean
% make

p.s. Если это явное имя, вы можете переопределить его в командной строке. Например: сделать все GCC=~/mytmpgccdir/gcc

ps Если вы используете LD_PRELOAD, вы можете захотеть, чтобы скрипт, подобный этому, устанавливал LD_PRELOAD перед запуском вашей программы. В противном случае легко запустить LD_PRELOAD для каждой команды, такой как /bin/ls, make, g++ и т. д.

person Mr.Ree    schedule 23.10.2009
comment
Потрясающий! Я попробую! - person dicroce; 23.10.2009

Во-первых, проверьте документацию qmake. Существует простой способ указать (в файле .pro), что определенная библиотека всегда должна быть связана.

Кроме того, поскольку вы просто экспериментируете, просто используйте LD_PRELOAD — перекомпиляция не требуется:

LD_PRELOAD="/usr/lib/foo/libtcmalloc.so" ./your_program

Вам не нужно связывать "your_program" с библиотекой Google tcmalloc.

person Brian G. Marete    schedule 22.10.2009