php内核bug:动态链接方式编译的扩展,扩展全局空间dtor导致core dump

注册扩展的全局空间代码如下:

#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()

时间: 2024-09-20 19:23:04

php内核bug:动态链接方式编译的扩展,扩展全局空间dtor导致core dump的相关文章

UNIX系统管理:动态链接程序程序搜索目录

在采用动态链接方式对程序进行编译,链接时候.链接程序只是在最终的可执行文件中记录下关于所引用的共享库中的符号的一些登记信息,以便在程序被执行时,动态链接程序能够根据这些登记信息找到相应的代码.因此登记动态链接方式而言,除了在链接阶段涉及到对库文件的搜索路径外,还有一个在程序运行阶段对库文件的搜索问题. 前一个问题我们知道借助于LD_LIBRARY_PATH环境变量及cc命令行中的-L选项已经得到了比较好的解决.对于第二个问题,我们必须提供一种机制,使得动态链接程序能够找到相应的动态库,然后才能将

ndk-Android NDk 怎么编译时动态链接第三方so库,有头文件

问题描述 Android NDk 怎么编译时动态链接第三方so库,有头文件 最近在做一个项目,大神把底层的算法封装成so(普通的c++函数),并给出头文件,我需要先 进行封装,然后给java调用.在我写的C++(符合JNI规范)里面调用so库函数, 下面贴图求解答: 1.项目的目录结构 其中 libvvw.so就是第三方库: Test_vvw.h就是第三方库的头文件 2.java 的native方法定义 3.native的实现方法体 FrameDecode.cpp文件 4.Android.mk文

第三章 装载与动态链接

装载与动态链接 1可执行文件的装载与进程 可执行文件只有装载到内存后才能被CPU执行.早期的程序装载十分简陋,装载的基本过程就是把程序从外部存储器中读取到内存中的某个位置. 历史有过的装载方式包括覆盖装载.页映射. 1.1 进程虚拟地址空间 程序是一个静态的概念,它就是一些预先编译好的指令和数据集合的一个文件:进程则是一个动态的概念,它是程序运行的一个过程. 每个程序被运行起来以后,都有自己的虚拟地址空间,这个虚拟地址空间的大小由计算机的硬件平台决定,具体地说是由CPU的位数决定的. 1.2 装

剖析一个由sendfile引发的linux内核BUG

在论坛上看到一个讲linux内核BUG的帖子,利用这个BUG,一个普通用户能够在运行某个程序之后,获得root权限. 示例的代码如下:http://www.securityfocus.com/data/vulnerabilities/exploits/36038-4.tgz 在ubuntu 9.04,内核版本2.6.28.12的机器上测试通过. (警告,此BUG已经是公开的秘密了.如果想用来干坏事,是很容易被发现的,并且将受到法律的制裁!) 也希望linux内核尽快修复该BUG. 那么,这究竟是

关于动态链接与静态链接

大家都知道应用程序有两种链接方式,一种是静态链接,一种是动态链接,这两种链接方式各有好处. 程序的静态连接还是动态连接是根据编译器的连接参数指定的. 所谓静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些.(所谓库就是一些功能代码经过编译连接后的可执行形式.) 所谓动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操

一个存在三年的内核 bug 引发大量的容器系统出现网络故障

一个存在三年的内核 bug 引发大量的容器系统出现网络故障 最近发现的一个 Linux 内核 bug,会造成使用 veth 设备进行路由的容器(例如 Docker on IPv6.Kubernetes.Google Container Engine 和 Mesos)不检查 TCP 校验码checksum,这会造成应用在某些场合下,例如坏的网络设备,接收错误数据.这个 bug 可以在我们测试过的三年内的任何一个内核版本中发现. 这个问题的补丁已经被整合进核心代码,正在回迁入3.14之前的多个发行版

Linux内核bug引起Mesos、Kubernetes、Docker的TCP/IP数据包失效

本文讲的是Linux内核bug引起Mesos.Kubernetes.Docker的TCP/IP数据包失效,[编者的话]最近发现Linux内核bug,会造成使用veth设备进行路由的容器(例如Docker on IPv6.Kubernetes.Google Container Engine和Mesos)不检查TCP校验码(checksum),这会造成应用在某些场合下,例如坏的网络设备,接收错误数据.这个bug可以在三年前任何一个测试过的内核版本中发现.补丁已经被整合进核心代码,正在回迁入3.14之

动态链接导入库与静态链接库

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Import Libary,以下简称"导入库"). 静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起.比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子. 动态库一般会有对应的导入库,方便程序静

动态代理方式实现AOP

摘要:面向对象的思想强调"一切皆是对象",在面向对象的程序中我们使用真实概念的模型思考问题,使得整个软件系统开发可以像搭建房屋一样有条不紊.然而面向对象也并非完美无缺的,它更注重于对象层次结构方面的东西,对于如何更好的管理对象行为内部结构,还存在着些许不足.那么我们如何使这个问题的得到更完美的解决呢?答案就是AOP. 主要内容: AOP简述 利用动态代理实现AOP 总结 一.AOP简述 AOP的概念早在上个世纪九十年代初就已经出现了,当时的研究人员通过对面向对象思想局限性的分析研究出了