Up Prev Next
From: Ted Law <tedlaw at cibcwg dot com>
Subject: Linking ctlib-linux-elf-dynamic on RedHat 5.1
Date: Aug 23 1998 9:38AM
After hours of machine level debugging, I finally figured out what's
going on. The symtom was that DBD::Sybase and Sybperl will work when
running from bash but not from zsh, whether it was linked dynamically or
statically. It turned out to be just a smoke screen. The real problem
is that ctlib-linux-elf-dynamic was compiled with a definition of struct
sigaction that is different from the one compiled into glibc 6 used in
The offsets for sa_mask, sa_flags, and sa_restorer were 4, 132, 136,
respectively in glibc. But ctlib-linux-elf-dynamic assumed 4, 8, 12.
So when sigaction is called with a non-null value for old_act, glibc
actually overwrites part of the stack. Then, when the overwritten part
is used as an address to write to, a SEG fault occurs. The reason why
it would work when running from bash was that the incorrect address
happens to fall into the unprotected gap between two shared libraries.
A workaround would be to write a wrapper for all struct sigaction
related routines to bridge the two sides. But I don't know how to do
that. Would some one please take this on?