去年就听说,这个环境变量可以不用设置了,是从15.0.3或者以上版本开始。但我还是将信将疑。
LD_POINTER_GUARD这个环境变量,作用是什么呢?
ASE在linux下,遇到glibc2.4以及更新版本的glibc库时,碰到了问题,结果通过设置这个环境变量为0或者1,得到一个workround,去绕过这个问题。到底是什么问题呢?
有一个CR#CR 479363,专门解决这个问题。15.0.2 ESD #4 and 15.0.1 Cluster Edition ESD #2.
是什么导致这个问题呢?
ASE实现了自己的内部使用的线程库,从一个线程切换到另一个线程(在Linux上),我们常常用到标准的跳转调用setjmp/logjmp。setjmp实际上只是获取当前上下文的一个快照,这个快照(jump缓冲)后来会被传递给longjmp,以用于跳转回到以前的上下文。这个小技巧可以让线程能够获取在共享内存里的相关栈数据,允许这些线程在多个操作系统进程之间调度。当创建一个新线程,但是没有合适的jump缓冲去跳转时,需要手动创建一个,并将栈指针放到共享内存里,这就是问题所在。
在glibc2.4里,有一个变化是把栈指针放到了jump缓冲里。setjmp会把当前的栈指针放到jump缓冲里,然后longjmp会取出栈指针,由