Re: Help booting a gpg encrypted loop-aes backed root partition

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jivko Sabev wrote:
> I have performed the tests Jari requested and here are the results:

Thanks.

> The base case the started this whole thread:
> 
> gcc --version
> gcc (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)

In this case, that (32bit x86 ubuntu-7.04) gcc compiles valid source code to
invalid object code.

> dietlibc version: 0.3 (from an ubuntu deb binary package)

dietlibc works as expected. No issues with it.


I tested that initrd-BAD.gz that you sent me (compiled using 32bit x86
ubuntu gcc-4.1.2) in my test box. It failed to boot on my test box, same as
your box. initrd-OK.gz that I compiled myself on my test box worked ok. More
testing/debugging follows:

Trying to manually run /linuxrc program from working initrd:

# zcat /boot/initrd-OK.gz >/tmp/foo
# mount -t minix /tmp/foo /mnt -o loop
# /mnt/linuxrc
ERROR: initrd config says USEPIVOT=1, but bootloader acts like USEPIVOT=0
# umount /mnt

Above error message is what I expected. /linuxrc code detected that it was
not running as process number 1, and terminated with an error message. The
pid needs to be 1 because later that code execve()s init process which must
run as pid 1.

Now trying to manually run /linuxrc program from your failing initrd:

# zcat /boot/initrd-BAD.gz >/tmp/foo
# mount -t minix /tmp/foo /mnt -o loop
# /mnt/linuxrc
Segmentation fault
# gdb /mnt/linuxrc
[snip]
(gdb) run
Starting program: /mnt/linuxrc
warning: shared library handler failed to enable breakpoint

Program received signal SIGSEGV, Segmentation fault.
0x08048383 in ?? ()
(gdb) disas 0x08048370 0x080483a3
Dump of assembler code from 0x8048370 to 0x80483a3:
0x8048370:      lea    0x4(%esp,1),%ecx
0x8048374:      and    $0xfffffff0,%esp
0x8048377:      pushl  0xfffffffc(%ecx)
0x804837a:      push   %ebp
0x804837b:      mov    %esp,%ebp
0x804837d:      sub    $0x5a8,%esp
0x8048383:      mov    %gs:0x14,%edx                <==== Seg fault here
0x804838a:      mov    %edx,0xfffffff0(%ebp)
0x804838d:      xor    %edx,%edx
0x804838f:      mov    %ecx,0xfffffff4(%ebp)
0x8048392:      mov    %ebx,0xfffffff8(%ebp)
0x8048395:      mov    %esi,0xfffffffc(%ebp)
0x8048398:      mov    0x4(%ecx),%eax
0x804839b:      mov    %eax,0x8049be8
0x80483a0:      call   0x8048798
End of assembler dump.
(gdb) quit
A debugging session is active.
Do you still want to close the debugger?(y or n) y
# umount /mnt

gcc compiler put that bogus "0x8048383: mov %gs:0x14,%edx" instruction
there. Instruction "0x804838d: xor %edx,%edx" is first "x=0;" assignment of
main() function.


I am going to add GCC= configuration entry to build-initrd.sh. The default
will be "gcc", same as before. I will also add a note that the default gcc
compiler on 32 bit x86 ubuntu 7.04 needs it overridden to "gcc-3.3". A patch
is included.

-- 
Jari Ruusu  1024R/3A220F51 5B 4B F9 BB D3 3F 52 E9  DB 1D EB E3 24 0E A9 DD


--- ../loop-AES-v3.2a/build-initrd.sh	2007-05-14 15:18:12.000000000 +0300
+++ build-initrd.sh	2007-08-14 21:08:27.000000000 +0300
@@ -2,7 +2,7 @@
 #
 #  build-initrd.sh
 #
-#  Written by Jari Ruusu, May 14 2007
+#  Written by Jari Ruusu, August 14 2007
 #
 #  Copyright 2001-2007 by Jari Ruusu.
 #  Redistribution of this file is permitted under the GNU Public License.
@@ -192,6 +192,11 @@
 # The dietlibc can be found at http://www.fefe.de/dietlibc/
 USEDIETLIBC=1
 
+# C compiler used to compile /linuxrc program.
+# 32bit x86 ubuntu-7.04 gcc-4.1.2 is known to miscompile /linuxrc. Affected
+# users should install gcc-3.3 package, and change this to GCC=gcc-3.3
+GCC=gcc
+
 # 1 = load extra module, 0 = don't load
 # If this is enabled, module must be manually copied to
 # /boot/modules-KERNELRELEASE/ directory under name like foomatic.o
@@ -632,9 +637,9 @@
 EOF
 
 if [ ${USEDIETLIBC} == 1 ] ; then
-    diet gcc -Wall -O2 -s -static -pipe tmp-c-$$.c -o tmp-c-$$
+    diet ${GCC} -Wall -O2 -s -static -pipe tmp-c-$$.c -o tmp-c-$$
 else
-    gcc -Wall -O2 -s -static -nostartfiles -pipe tmp-c-$$.c -o tmp-c-$$
+    ${GCC} -Wall -O2 -s -static -nostartfiles -pipe tmp-c-$$.c -o tmp-c-$$
 fi
 rm -f tmp-c-$$.[co]

-
Linux-crypto:  cryptography in and on the Linux system
Archive:       http://mail.nl.linux.org/linux-crypto/


[Index of Archives]     [Kernel]     [Linux Crypto]     [Gnu Crypto]     [Gnu Classpath]     [Netfilter]     [Bugtraq]
  Powered by Linux