Subject: COMPAT_IBCS2, SCO OSR5 executables SEGV on NetBSD 2.0
To: None <tech-kern@netbsd.org>
From: J Chapman Flack <flack@cs.purdue.edu>
List: tech-kern
Date: 12/29/2004 16:51:16
I have an old SCO OSR5 box that I'd like to retire, but I'd like to keep
the most costly applications I had for it, and move them to a NetBSD box.
My kernel is compiled with COMPAT_IBCS2 and I have an /emul/ibcs2 with
shlib, lib, and usr/lib populated with the SCO shared libs.
The only thing I can get a COFF executable to do is dump core:
$ ktruss -t A ./mapleV
4341 ktruss emul(netbsd)
4341 mapleV emul(ibcs2)
4341 mapleV execve("./mapleV", 0xbfbff810, 0xbfbff818) JUSTRETURN
4341 mapleV SIGSEGV SIG_DFL
To check if it wasn't just Maple, I also tried one of the few COFF
executables that came with OSR5, /lib/idcomp, and it did the same thing:
$ ktruss -t A ./idcomp
12066 ktruss emul(netbsd)
12066 idcomp emul(ibcs2)
12066 idcomp execve("./idcomp", 0xbfbff820, 0xbfbff828) JUSTRETURN
12066 idcomp SIGSEGV SIG_DFL
With an ELF executable, the results are different: I get SIGABRT instead
of SIGSEGV. ;)
$ ./wc
Abort
$ ktruss -t A ./wc
8749 ktruss emul(netbsd)
Does this look like the ELF executable isn't being recognized as needing
emulation?
$ file wc
wc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), stripped
$ ldd wc
wc:
/usr/lib/libc.so.1 => not found
$ ls -l /emul/ibcs2/usr/lib/libc.so.1
-r-xr-xr-x 1 operator kmem 359652 Apr 23 1995 /emul/ibcs2/usr/lib/libc.so.1
I found this comment in /usr/src/sys/compat/ibcs2/ibcs2_exec_elf32.c:
* The SCO compiler adds the string "SCO" to the .notes section of all
* binaries I've seen so far.
It seems to be there:
$ readelf -x 14 wc
Hex dump of section '.note':
0x00000000 004f4353 00000001 0000000c 00000004 ............SCO.
0x00000010 00010000 00000003 00010001 ............
Maybe there's a bug in the ibcs2 elf recognition? Hmm - is there any way
to exec a file and force a specified emulation to be used, just to see if
it works right that way?
The COFF problem looks less simple. I was hoping the ktruss would show
something interesting, like an obviously bogus system call before the SEGV,
but no, it's just right after the exec. gdb is not immediately useful:
This GDB was configured as "i386--netbsdelf"
..."/tmp/idcomp": not in executable format: File format not recognized
Core was generated by `idcomp'.
Program terminated with signal 11, Segmentation fault.
warning: Couldn't find general-purpose registers in core file.
#0 0x00000000 in ?? ()
If I wanted to debug this further, would I start by building an ibcs2/coff
version of gdb just to learn what I can from the core file? Moving the core
file back to the SCO box doesn't help; that debugger doesn't grok this
core file format.
Any suggestions?
Thanks,
-Chap