سؤال

أرغب في استخدام تطبيق OpenBSD لـ Malloc و RealLoc ومجاني على سطح المكتب Debian Lenny بدلاً من GLIBC.

  1. هل هم ببساطة يسقطون في بدائل: هل سيعملون على سطح مكتب Linux الخاص بي؟

  2. ما هي الملفات (الملفات) التي أحتاجها وأي حزمة 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.

يحتاج رمز الخيوط إلى استبدال كامل ، بالطبع.

هنا: http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c.

قد تضطر إلى جلب بعض التبعيات.

يمكنك استخدامه كما تفعل آخر (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 وربطه كما هو مطلوب.

لديك أيضًا خيار بناء روتينات BSD Malloc مع الكود الخاص بك ، تمامًا كما تفعل أي وحدة أخرى (مثال خام بما في ذلك 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;
}

للحصول على نهج أكثر على نطاق النظام ، أوصي حقًا بالسير في مسار الكائن المشترك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top