Я хотел бы использовать реализацию OpenBSD malloc, перевыделение и свободный на моем рабочем столе Debian lenny, а не glibc's.
Они просто заглядывают заменам: они будут работать над моим рабочим столом Linux?
Которые являются файлом (файлами), в котором я нуждаюсь и какой пакет OpenBSD содержит их?
У Google есть своя библиотека для замены malloc по адресу. http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools с инструкциями по ее использованию. Они утверждают, что для ее использования достаточно подключить ее (до того, как будет подключена стандартная версия).
Я не знаю, есть ли что-то особенное в версии OpenBSD, что могло бы помешать этому. Если это malloc и некоторые другие стандартные библиотечные вещи вместе, то это, вероятно, будет сложнее.
Технически он идеально переносится, поскольку использует mmap (2)
, но вы не можете просто скопировать и вставить.
Для справки:
Это файлы:
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c
http: // www.openbsd.org / cgi-bin / cvsweb / src / lib / libc / crypt / arc4random.c
,
http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/ libc / include / thread_private.h
Плюс пара определений:
PGSHIFT
, которые должны быть log2 размера страницы вашей системы. И MADV_FREE
, флаг, который AFAICT недоступен в Linux.
Разумеется, код потоковой передачи требует полной замены.
Вы можете использовать его так же, как другие (1) заменители (2) malloc ()
подсистем.
В первом примере malloc ()
обычно заменяется с помощью:
#define malloc(n) GC_malloc(n)
#define calloc(m,n) GC_malloc((m)*(n))
...
#define free(n) GC_free(n)
Затем вы связываете новую библиотеку malloc () (статически или динамически).
Во втором примере LD_PRELOAD
используется для перехвата вызовов malloc ()
/ free ()
.
Я рекомендую вам сделать первый вариант: создать статический / общий объект с именем bsdmalloc
и связать его по желанию.
У вас также есть возможность просто построить подпрограммы malloc BSD с вашим кодом, как и любой другой модуль (грубый пример, включающий только stdlib, где прототип malloc):
#include <stdlib.h>
#define malloc(n) BSD_malloc(n)
void *BSD_malloc(int n)
{
return NULL;
}
int main(void)
{
char *ret;
ret = (char *) malloc(1024);
return ret == NULL ? 1 : 0;
}
Для более общесистемного подхода я действительно рекомендую идти по маршруту общих объектов.