Компиляция пользовательского malloc - PullRequest
6 голосов
/ 28 апреля 2011

Я написал пользовательскую библиотеку, которая реализует malloc / calloc / realloc / free с использованием стандартных прототипов C, и я выяснил, как скомпилировать ее так.Я хочу протестировать библиотеку, привязав к ней стандартное приложение?Что было бы хорошим способом сделать это?Когда у меня есть рабочая библиотека, я предполагаю, что могу просто загрузить ее с помощью LD_PRELOAD, но как мне заставить мои функции сосуществовать, но иметь приоритет над функциями системной библиотеки?Моим функциям нужно вызвать malloc, чтобы заставить память работать, поэтому я не могу просто полностью отказаться от stdlib ... Помощь?

Ответы [ 3 ]

4 голосов
/ 28 апреля 2011

Функции, которые вы пытаетесь заменить, являются стандартными функциями C, а не макросами или системными вызовами. Поэтому вы должны просто дать своим функциям одинаковые имена и скомпилировать их в общую библиотеку.

Затем используйте LD_PRELOAD для предварительной загрузки библиотеки перед запуском двоичного файла. Поскольку все адреса разрешаются один раз, компоновщик выяснит адреса ваших функций и запомнит их имена и не будет искать их в стандартной библиотеке позже.

Этот подход может не работать, если ваша программа статически связана со стандартным временем выполнения. Кроме того, он не будет работать в Mac OS X, поскольку есть другой API для интерполяции.

Например, в Linux, чтобы ваши функции сосуществовали (например, если вы хотите использовать систему malloc в собственной реализации malloc), вы должны вручную открыть стандартную библиотеку, используя dlopen, найдите нужные вам функции с помощью dlsym и вызовите их позже по адресу.

2 голосов
/ 28 апреля 2011

Не пишите malloc() в терминах malloc() - запишите его с помощью sbrk, который получает память непосредственно из ОС.

1 голос
/ 28 апреля 2011

Если у вас есть контроль над исходным кодом, который должен использовать эту библиотеку, здесь есть одна возможность.Используйте разные имена функций: вместо malloc, например, назовите его newCoolMalloc.Этот метод иногда проще и не зависит от специальных параметров компоновщика.

Затем в своем коде используйте #define, чтобы код вызывал нужный набор функций.Вы можете #define malloc быть чем-то другим.Например:

#define malloc newCoolMalloc
#define free   newCoolFree

Если вы делаете это, вы должны быть очень и очень осторожны, чтобы включать это последовательно.В противном случае вы рискуете использовать stdlib malloc в одном месте, а затем и свой бесплатный в другом, что приведет к грязным ошибкам.Один из способов помочь смягчить эту ситуацию - это (если возможно) в своем собственном коде использовать пользовательские имена для функций выделения и освобождения.Тогда легче убедиться, что вызывается правильный.Вы можете определить различные пользовательские имена для своих собственных функций malloc или даже для исходных функций malloc stdlib.

Например, вы можете использовать mallocPlaceHolder в качестве фактического имени в коде:

someThing = mallocPlaceHolder( nbytes );

Тогда ваши определения будут выглядеть примерно так:

#define mallocPlaceHolder myCoolMalloc

Если нетФункция вида mallocPlaceHolder (и связанная с ней свободная) фактически существует, она позволяет избежать смешивания разных библиотек.

...