[php内核bug]动态链接方式编译的扩展, 扩展全局空间dtor导致core dump
2013-01-18 14:15
489 查看
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()
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扩展框架各个宏编译成so动态链接库文件之后对应的函数符号对照
- PHP7 学习笔记(九)phpsize动态编译openssl扩展 (微信公众平台)
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
- 编译时向内核添加新设备 模块的方式动态的将驱动加入内核,但这种方式加入的驱动程序,当系统重新启动时, 还需要重新用模块的方式进行插入,如果是系统内常用的设备驱动采用这种方式进行加载, 就会很不方便。
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
- PHP动态编译扩展
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
- vc.net中MFC静态与动态链接问题与release方式编译
- 用phpize编译动态扩展模块
- 用apache的动态so模式编写和编译php扩展
- PHP扩展开发之动态加载so模块与静态重编译PHP(下)
- Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
- Linux下共享方式编译PHP扩展
- PHP动态编译出现Cannot find autoconf 动态编译PHP的memcache扩展库
- 用apache的动态so模式编写和编译php扩展
- PHP扩展开发之动态加载so模块与静态重编译PHP(上)
- 用php的c扩展编程调用 c程序的动态链接库
- linux下由于线程局部存储未初始化导致加载动态链接库时程序崩溃的BUG
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
- 用apache的动态so模式编写和编译php扩展