[php内核bug]动态链接方式编译的扩展, 扩展全局空间dtor导致core dump
来源:互联网 发布:opencv java 图片切割 编辑:程序博客网 时间:2024/04/29 23:32
author: goosman.lei(雷果国)
blog: http://blog.csdn.net/lgg201
mail: lgg860911@yahoo.com.cn
相关代码可以参考<php extending and embedding>一书第12章, "Extension Globals"一节.
注册扩展的全局空间代码如下:
#ifdef ZTS
ts_allocate_id(&sample_globals_id, sizeof(zend_sample_globals), (ts_allocate_ctor)ZEND_MODULE_GLOBALS_CTOR_N(sample), (ts_allocate_dtor)ZEND_MODULE_GLOBALS_DTOR_N(sample));
#else
sample_globals_ctor(&sample_globals TSRMLS_CC);
#endif
在ts_allocate_id()函数调用中, 向resource_types_table这个数组中写入了一条记录.
在tsrm_shutdown()的过程中, 将调用注册的dtor回调函数.
但是我这边在按照书上编码完后, 运行测试代码会有coredump.
经过跟踪发现, 在zend_shutdown()的调用过程中, 已经对模块调用了DL_UNLOAD(module->handle); 导致当时注册的句柄(dtor)在执行tsrm_shutdown()时已经不可访问.
同时, 看到标准扩展中的ext/standard/file.c中也有这种注册方式的使用, 不过, 它应该是静态编译所以没有问题. 而我的扩展是编译.so动态链接的.
下面是跟踪zend_shutdown()最终到DL_UNLOAD()的调用路径.
zend_shutdown() => zend_desctroy_modules() => zend_hash_graceful_reverse_destroy() => zend_hash_apply_deleter() => module_destructor() => DL_UNLOAD()
- [php内核bug]动态链接方式编译的扩展, 扩展全局空间dtor导致core dump
- PHP的动态扩展
- 64位动态php扩展库的编译
- 安装php的mcrypt扩展(动态加载编译)
- php的memcache扩展编译
- php的MongoDB扩展编译
- PHP动态编译出现Cannot find autoconf 动态编译PHP的memcache扩展库
- php使用memcached扩展的一个BUG
- PHP内核的学习--创建PHP扩展
- java 动态扩展方式
- php的内核扩展怎么写?
- PHP扩展调用so动态链接库(1)
- PHP扩展调用so动态链接库(1)
- PHP扩展调用so动态链接库(2)
- 编译php扩展
- PHP编译安装扩展
- 编译php-memcache扩展
- php-redis扩展编译
- git linux
- memcached全面剖析–3.memcached的删除机制和发展方向
- 【QTP学习笔记 1 】下拉框数据随机选择,日期输入,如何获取动态的对话框
- android 系统的生成,CyanogenMod源码下载和编译 CM7
- 陶仁贤学习笔记6(天空环境、阳光效果)
- [php内核bug]动态链接方式编译的扩展, 扩展全局空间dtor导致core dump
- Android通过共享用户ID来实现多Activity进程共享
- ajax的原理和应用
- 禁用CvNamedWindow中的关闭按钮
- 基于会话的报告分析
- cximage+png图片处理
- C# Winform如何使用配置文件
- android更新ADT到最新版本出错
- Android ApiDemos示例解析(1):创建ApiDemo示例