堆越界--coredump 在malloc函数里
一,可执行程序分析:
objdump -h xxx,可以看到程序内部各个段的内存分布,结果如下(部分):
26 .data 0000016c 0000000000879d20 0000000000879d20 00279d20 2**5CONTENTS, ALLOC, LOAD, DATA27 .bss 00001000 0000000000879ea0 0000000000879ea0 00279e8c 2**5ALLOC
实时上,各个段的信息不包括heap和stack的信息。
二,signal 11, Segment Fault。
malloc,内存块实际上是挂在链表上。数据结构包括next,内容,大小。不能被写坏,否则可能造成coredump。
原因见malloc / free 流程图(数据结构)。
今天看见一篇写得很好的文章可以说明这个问题:--
http://www.cnblogs.com/onlyforcloud/articles/4476436.html
- malloc实际是调用Void_t* public_mALLOc(size_t) --> victim = _int_malloc(ar_ptr, bytes); 接下来分析 _int_malloc内部流程
- 根据size_t传递的大小计算出mfastbinptr。(idx = fastbin_index(nb);mfastbinptr* fb = &fastbin (av, idx);)| #define fastbin_index(sz) \ ((((unsigned int)(sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2) | #define fastbin(ar_ptr, idx) ((ar_ptr)->fastbinsY[idx]) | struct malloc_state { ... mfastbinptr fastbinsY[NFASTBINS]; ... }
- 因此实际上public_mALLOc会从 arena_lookup(ar_ptr)里查找出ar_ptr。
- # define tsd_getspecific(key, vptr) (vptr = (key))
static tsd_key_t arena_key; ar_ptr实际等于arena_key.
typedef struct malloc_chunk* mchunkptr;
sYSMALLOc -> struct malloc_par