Re: Fwd: Segfaulting with Ubuntu
Jay Sullivan <[email protected]>
| Newsgroups | gmane.linux.lib.dietlibc |
|---|---|
| Message-ID | <[email protected]> |
I tested your CVS update, and it worked great. Thanks for getting that in so quickly! On Fri, Feb 5, 2010 at 12:43 PM, Felix von Leitner <[email protected]> wrote: >> That worked! What exactly causes this issue? Certainly not a buffer >> overflow in dietlibc? > > I added a workaround to the Makefile. > > The issue is this: Ubuntu adds -fstack-protector to the gcc default > flags, without telling anyone. On x86_64, this emits code like this: > > b: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax > 12: 00 00 > 14: 48 89 45 f8 mov %rax,-0x8(%rbp) > > at the beginning of each function, and > > 24: 48 8b 55 f8 mov -0x8(%rbp),%rdx > 28: 64 48 33 14 25 28 00 xor %fs:0x28,%rdx > 2f: 00 00 > 31: 74 05 je 38 <foo+0x38> > 33: e8 00 00 00 00 callq 38 <foo+0x38> > 34: R_X86_64_PC32 __stack_chk_fail+0xfffffffffffffffc > > at the end of each function. Now, %fs is not initialized, and accessing > %fs:0x28 segfaults. The libc startup code is expected to set this up, > so that that memory can be accessed and there is a random value at that > address. Now, since Ubuntu enables the stack protector globally, the > function in dietlibc that sets up %fs and %fs:0x28 is ALSO compiled with > this extra code, and the first part accesses %fs:0x28 before the > function has a chance to set it up, causing a segfault. > > If you ask me, the Ubuntu people deserve a kick in the nuts for this. > > I added a workaround to the cvs Makefile. > > Please note that dietlibc does not support -fstack-protector on all > platforms, because I do not have access to all platforms. So you might > still get segfaults on non-x86 platforms. If you do, please contact me > so we can add stack-protector support for your platform. > > Felix >