rpm: illegal instruction

Michal Kochanowicz michal w michal.waw.pl
Sob, 7 Lip 2001, 18:23:48 CEST


Cześć

On Fri, Jul 06, 2001 at 02:20:55AM +0200, Michal Kochanowicz wrote:
> Przebudowałem rpm'a za pomocą:
> # rpm -bb rpm.spec --target=i586
> Po zrobieniu upgrade autoconf i gettext-* zbudował się. Tyle że teraz na
> tym i586, dla którego jest przeznaczony dostaję coś takiego:
> # strace /tmp/rpm -Uhv rpm-utils-4.0.2-22.i586.rpm rpm-4.0.2-22.i586.rpm --force
> [...]
> munmap(0x40189000, 4096)                = 0
> --- SIGILL (Illegal instruction) ---
> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
> --- SIGSEGV (Segmentation fault) ---
> +++ killed by SIGSEGV +++
> 
> Huston, we have a problem.
Przebudowałem tego rpm'a z CFLAGS="-g -O0".
(gdb) set args -Fv exim-3.31-1.i586.rpm
(gdb) run
Starting program: /tmp/rpm -Fv exim-3.31-1.i586.rpm
 
Program received signal SIGILL, Illegal instruction.
0x080a6c26 in __os_malloc ()
(gdb) bt
#0  0x080a6c26 in __os_malloc ()
#1  0x080a6be2 in __os_calloc ()
#2  0x08092899 in db_create ()
#3  0x08087fe7 in db3open (rpmdb=0x81468a8, rpmtag=0, dbip=0xbffff9a4) at db3.c:665
#4  0x08070796 in dbiOpen (rpmdb=0x81468a8, rpmtag=0, flags=0) at rpmdb.c:266
#5  0x08071b62 in openDatabase (prefix=0x80fb48c "/", dbpath=0x0, _dbapi=3, dbp=0xbffffb68, mode=66,
    perms=420, flags=0) at rpmdb.c:805
#6  0x08071d23 in rpmdbOpen (prefix=0x80fb48c "/", dbp=0xbffffb68, mode=66, perms=420) at rpmdb.c:866
#7  0x08076f03 in rpmInstall (rootdir=0x80fb48c "/", fileArgv=0x8124e58, transFlags=0, interfaceFlags=96,
    probFilter=RPMPROB_FILTER_NONE, relocations=0x0) at rpminstall.c:331
#8  0x0804e997 in main (argc=3, argv=0xbffffd04) at rpm.c:1146
#9  0x400635e2 in __libc_start_main () from /lib/libc.so.6

To mój pierwszy raz z gdb bez ddd więc jeśli jeszcze coś ciekawego można
było wyciągnąć chętnie się o tym dowiem :)

No dobra. Dalej zrobiłem tak:
(gdb) disassemble __os_malloc
Dump of assembler code for function __os_malloc:
[ciach]
0x80a6c26 <__os_malloc+26>:     cmove  %eax,%esi

Na stronie http://www.oberon.ethz.ch/native/compiler/instructions.html
znalazłem informację że instrukcja cmove została wprowadzona w
procesorach PentiumPro, czyli nie powinna znaleźć się w binarce
przeznaczonej dla i586.

Ponieważ:
(gdb) info address __os_malloc
Symbol "__os_malloc" is at 0x80a6c0c in a file compiled without debugging.

domyślam się że ta instrukcja pochodzi z którejś z bibliotek. Ponieważ
rpm jest linkowany statycznie nasuwa się wniosek że statyczne linkowanie
i użycie --target wzajemnie się wykluczają. Wydaje mi się że należałoby
to jakoś usankcjonować na poziomie rpm'a - tyle że to wymagałoby
jakiegoś oznaczania pakietów linkowanych statycznie. Jakimś rozwiązaniem
mogłoby być odmowa działania jeśli użyto --target a pakiet zawiera
BuildRequires:.*-static. Co o tym sądzicie?
-- 
--= Michal Kochanowicz==--==--==BOFH==--==--==michal w michal.waw.pl =--
--= finger me for PGP public key or visit http://michal.waw.pl/PGP =--
--==--==--==--==--==-- Vodka. Connecting people.--==--==--==--==--==--



Więcej informacji o liście dyskusyjnej pld-devel-pl