SIGILL on brl instruction

Symptoms

You are seeing a SIGILL (Illegal Instruction) when you hit a brl instruction

Example

Note below gdb gives the faulting address as 0x4000000002737901, which, when you look at the disassembled output is a brl instruction.

Program received signal SIGILL, Illegal instruction.
0x4000000002737901 in __libc_csu_fini ()
(gdb) bt
#0  0x4000000002737901 in __libc_csu_fini ()
#1  0x4000000002737790 in __libc_csu_init ()
#2  0x20000000002a1220 in __libc_start_main () from /lib/libc.so.6.1
#3  0x4000000000004260 in _start ()
(gdb) disassemble
Dump of assembler code for function __libc_csu_fini:
0x4000000002737830 <__libc_csu_fini+0>: [MII]       alloc r36=ar.pfs,6,6,0
0x4000000002737831 <__libc_csu_fini+1>:             addl r14=58216,r1
 [ ... more of the same removed ... ]
0x4000000002737901 <__libc_csu_fini+209>:                   brl.few 0x40000000000027e0 <_init>;;

Solution

On the Itanium 1 (the original Itanium) the brl instruction must be emulated by the operating system. Chances are you are running a kernel built for a Itanium 2 (or McKinley) system, which does not have this support built in. In Debian, ensure your kernel package has the extension -itanium family rather than the -mckinley extension.

IA64wiki: SIGILLonBRL (last edited 2009-12-10 03:14:04 by localhost)

Gelato@UNSW is sponsored by
the University of New South Wales National ICT Australia The Gelato Federation Hewlett-Packard Company Australian Research Council
Please contact us with any questions or comments.