Используйте malloc OpenBSD, перевыделение и свободный в моей программе

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

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

  2. Которые являются файлом (файлами), в котором я нуждаюсь и какой пакет OpenBSD содержит их?

7
задан Neeladri Vishweswaran 20 May 2010 в 20:25
поделиться

4 ответа

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

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

2
ответ дан 7 December 2019 в 03:12
поделиться

Здесь: http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c .

Возможно, вам придется внести некоторые зависимости.

2
ответ дан 7 December 2019 в 03:12
поделиться

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

Разумеется, код потоковой передачи требует полной замены.

4
ответ дан 7 December 2019 в 03:12
поделиться

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

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

1
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: