Question

Je voudrais utiliser la mise en œuvre d'OpenBSD malloc, realloc et libre sur mon

bureau Debian Squeeze plutôt que de glibc.
  1. Sont-ils simplement le remplacement baisse: vont-ils travailler sur mon ordinateur de bureau Linux

  2. Quelles sont les fichier (s) que j'ai besoin et quel paquet OpenBSD les contient?

Était-ce utile?

La solution

Google a sa propre bibliothèque de remplacement malloc à http://code.google.com/p/google-perftools/wiki/ GooglePerformanceTools avec des instructions pour l'utiliser. Ils disent que tout ce que vous devez faire est de lien dans (avant la version standard est liée à) à l'utiliser.

Je ne sais pas s'il y a quelque chose de spécial à propos de la version OpenBSD qui empêcherait cela. Si elle est malloc et quelques autres trucs de bibliothèque standard ensemble, il est probablement plus difficile, cependant.

Autres conseils

Techniquement, il est parfaitement portable car il utilise mmap(2), mais vous ne pouvez pas simplement copier et coller.

Pour référence:

Les fichiers sont:

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

De plus une paire de définit:

PGSHIFT qui doit être la log2 de la taille de la page de votre système. Et MADV_FREE, un drapeau qui AFAICT n'est pas disponible sous Linux.

Le code de filetage doit remplacement complet, bien sûr.

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

Vous pourriez avoir à apporter dans certaines dépendances cependant.

Vous pouvez l'utiliser comme vous le feriez autre (1) < a href = "http://linux.die.net/man/3/efence" rel = "nofollow noreferrer"> remplacement (2) sous-systèmes de malloc().

Dans le premier exemple, malloc() est généralement remplacé par:

#define malloc(n) GC_malloc(n)
#define calloc(m,n) GC_malloc((m)*(n))
...
#define free(n) GC_free(n)

Liez ensuite contre la nouvelle bibliothèque malloc () (statique ou dynamique).

Dans le second exemple, LD_PRELOAD est utilisé pour les appels d'interception à malloc() / free().

Ce que je vous recommande de faire est la première option, créer un objet statique / partagé appelé bsdmalloc et lien contre comme vous le souhaitez.

Vous avez également la possibilité de construire simplement les routines malloc BSD avec votre code, comme vous le feriez pour tout autre module (exemple brut pour ne stdlib où malloc est prototypé):

#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;
}

Pour une approche plus large du système, je vous recommande vraiment aller la route objet partagé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top