Комментарии 4
Может она не выделиться если отключить поддержку исключений?
Я правильно понимаю, что автор сам, т.е. своим аллокатором, создал себе проблему и мужественно её преодолел ? :-)
Я попробовал сделать что-то подобное на FreeBSD: две заглушки для malloc(), одна на Си, другая на C++. Вот как это выглядит у меня:
Malloc wrapper in C on FreeBSD
rz@butterfly:~/code_snippets/C/Preload % make clean testc
rm -rf libpreload.o libpreloadc.so libpreloadcpp.so
=== Building malloc wrapper in C
cc -c -fPIC -o libpreload.o libpreload.c
cc -shared -o libpreloadc.so libpreload.o
=== Testing malloc wrapper written in C
FreeBSD butterfly 13.5-RELEASE-p9 FreeBSD 13.5-RELEASE-p9 GENERIC amd64
LD_PRELOAD=./libpreloadc.so /bin/ls -al
MALLOC: 128
MALLOC: 377
ls: fts_open: MALLOC: 2
Invalid argument
*** Error code 1
Stop.
make: stopped in /usr/home/rz/code_snippets/C/PreloadMalloc wrapper in C++ on FreeBSD
rz@butterfly:~/code_snippets/C/Preload % make clean testcpp
rm -rf libpreload.o libpreloadc.so libpreloadcpp.so
=== Building malloc wrapper in C++
c++ -c -fPIC -o libpreload.o libpreload.cpp
c++ -shared -o libpreloadcpp.so libpreload.o
=== Testing malloc wrapper written in C++
FreeBSD butterfly 13.5-RELEASE-p9 FreeBSD 13.5-RELEASE-p9 GENERIC amd64
LD_PRELOAD=./libpreloadcpp.so /bin/ls -al
MALLOC: 4096
Class Test has been constructed
MALLOC: 128
MALLOC: 377
ls: fts_open: MALLOC: 2
Invalid argument
*** Error code 1
Stop.
make: stopped in /usr/home/rz/code_snippets/C/PreloadКак видно, если не использовать stdlib++, то первые аллокации совсем крохотные - столько, солько требуется утилите /bin/ls. Если использовать библиотку libstdc++, то её инициализация запрашивает 4096 байт (ровно одну страничку).
На Linux-е этот же тест действительно первым запросом показывает 72704 байт. Еще один плюс в карму FreeBSD. ;-)
Забавно, но на Linux-е результат malloc() не проверяется на NULL не внутри инициализации stdlib++, не в коде /bin/ls. Моя обертка выдает NULL, а программа продолжает работу как будь-то всё в порядке и снимается с ипольнения только системой когда уже совсем того:
Malloc wrapper in C++ on Linux
rz@devbox:~/Preload$ make clean testcpp
rm -rf libpreload.o libpreloadc.so libpreloadcpp.so
=== Building malloc wrapper in C++
c++ -c -fPIC -o libpreload.o libpreload.cpp
c++ -shared -o libpreloadcpp.so libpreload.o
=== Testing malloc wrapper written in C++
Linux devbox 4.15.0-30-generic #32-Ubuntu SMP Thu Jul 26 17:42:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
LD_PRELOAD=./libpreloadcpp.so /bin/ls -al
MALLOC: 72704
MALLOC: 552
MALLOC: 552
MALLOC: 1024
Class Test has been constructed
MALLOC: 5
MALLOC: 552
MALLOC: 5
MALLOC: 34
MALLOC: 10
MALLOC: 56
/bin/ls: memory exhausted
Makefile:27: recipe for target 'testcpp' failed
make: *** [testcpp] Error 2PS: Мой код: https://github.com/pointcheck/code_snippets/tree/master/C/Preload
Почему первый вызов моей malloc всегда аллоцирует 72 КБ?