Tuesday, September 19, 2006

Inaugural post! RedHat IA64 "mixed-mode" RPMs

With RedHat Enterprise on Itanium (IA64), you can run both 64-bit and 32-bit applications. However, the way in which RedHat handles this is not particularly intuitive, and can cause problems/confusion with the RPM database.

For instance:

[root@ia64 root]# rpm -q zlib
zlib-1.1.4-8.1
zlib-1.1.4-8.1


You may be wondering why there are two zlib packages listed in the rpm database, and you'd be right to do so. On i386 RedHat, finding a package listed twice in the database typically means that something went wrong with installing the update package, causing the rpm transaction to quit before removing the old database entry. However, in this case, that isn't what's happening; note that the version numbers are identical.

This is how RedHat handles having both 64-bit and 32-bit versions of the files. For 64-bit applications and libraries, it uses the RedHat standard directory structure. For the 64-bit version of zlib, the package installs the following:

[root@ia64 root]# rpm -ql zlib-1.1.4.ia64
/usr/lib/libz.so.1
/usr/lib/libz.so.1.1.4
/usr/share/doc/zlib-1.1.4
/usr/share/doc/zlib-1.1.4/README


However, for the 32-bit version of zlib, the results are slightly different:

[root@ap1 root]# rpm -ql zlib-1.1.4.i386
/emul/ia32-linux/usr/lib/libz.so.1
/emul/ia32-linux/usr/lib/libz.so.1.1.4
/usr/share/doc/zlib-1.1.4
/usr/share/doc/zlib-1.1.4/README


Note the leading /emul/ia32-linux (emul short for emulation). Thankfully, within /emul/ia32-linux, RedHat duplicates the standard directory structure, so things are where you expect them to be.

To verify:

[root@ap1 root]# file /usr/lib/libz.so.1.1.4 /emul/ia32-linux/usr/lib/libz.so.1.1.4
/usr/lib/libz.so.1.1.4: ELF 64-bit LSB shared object, IA-64, version 1 (SYSV), stripped
/emul/ia32-linux/usr/lib/libz.so.1.1.4: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped



When installing packages, be careful to remember this oddity, because RedHat Enterprise v. 3 tools aren't kind enough to say something, they will default to installing 64-bit versions. While this isn't often a problem, there are instances when you want both versions. To make sure that you get the 32-bit version, pass the --arch= flag to up2date:

up2date --arch=i386 -i zlib

Enjoy.

0 Comments:

Post a Comment

<< Home