Использовать malloc, realloc и free в OpenBSD в моей программе - PullRequest
7 голосов
/ 21 мая 2010

Я бы хотел использовать реализацию malloc, realloc и free в OpenBSD на моем рабочем столе Debian lenny вместо glibc.

  1. Они просто заменяют: будут ли они работать на моем рабочем столе Linux?

  2. Какие файлы мне нужны и какой пакет OpenBSD содержит их?

Ответы [ 4 ]

4 голосов
/ 21 мая 2010

Технически он идеально переносим, ​​поскольку использует 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.

Поточный код, конечно, нуждается в полной замене.

2 голосов
/ 21 мая 2010
2 голосов
/ 21 мая 2010

У Google есть собственная библиотека замены malloc по адресу http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools с инструкциями по его использованию. Они говорят, что все, что вам нужно сделать, это связать его (до того, как будет добавлена ​​стандартная версия), чтобы использовать его.

Я не знаю, есть ли что-то особенное в версии OpenBSD, которая помешала бы этому. Если это malloc и некоторые другие стандартные библиотеки вместе, это, вероятно, более сложно.

1 голос
/ 21 мая 2010

Вы можете использовать его так же, как и другие (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;
}

Для более системного подхода, я действительно рекомендую пойти по пути общего объекта.

...