Ho notato alcune differenze nel comportamento dell'amplificatore di memoria dinamica GNU / Linux in i386 vs amd64. Mentre è possibile che sto fraintendendo qualcosa (in questo caso fammi sapere), non capisco perché queste differenze siano presenti e prima di scavare all'interno del codice voglio sapere se qualcuno ha già studiato questo.
Prendiamo questo programma (test.c) come esempio:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
unsigned int *a = malloc(100); //(1)
memcpy(a,"AAAAAAAAAAAAAAAAAA",18);
free(a); //(2)
unsigned int *b = malloc(10); //(3)
memcpy(b,"BBBBBB",6);
return 0;
}
Dopo il malloc in (1) abbiamo in entrambi i casi che lo spazio è preso direttamente dal blocco in alto, e questo è come previsto:
Tuttaviadopoilfreein(2)sipuònotarelaprimadifferenza:
Come si può vedere dallo screenshot nei bit ELF-64 il blocco che è stato liberato non viene aggiornato con la nuova dimensione, ma la dimensione è ancora 0x71 e il primo QWORD è annullato. Nei bit ELF-32, come mi aspettavo, il blocco liberato viene invece unito al Top Chunk e la dimensione viene aggiornata a 0x20f99 + 0x68 = 0x21001.
Più tardi, quando viene eseguito il secondo malloc in (3), nel caso x64 il nuovo blocco viene assegnato subito dopo il chunk precedente riducendo la parte superiore, mentre nel caso i386 il chunk precedentemente liberato viene riutilizzato.
Queste sono solo due delle differenze che ho notato e penso che ce ne siano molte altre ...
Quindi, c'è da qualche parte un documento / ricerca / white paper che descrive queste differenze?
Sto usando libc-2.23.so su una Ubuntu 16.04
Grazie in anticipo per qualsiasi informazione su questo.