[Fedora-livecd-list] [PATCH] fix build with syslinux >= 5

Joshua C. joshuacov at gmail.com
Thu Apr 25 10:38:54 UTC 2013


>From 127ed90d89325e3c070959404e55b79c56e8a562 Mon Sep 17 00:00:00 2001
From: Joshua Covington <joshuacov_at_gmail_dot_com>
Date: Wed, 24 Apr 2013 17:54:27 +0200
Subject: [PATCH] fix build with syslinux >= 5

This is based on F17 but should be easily rebased to f18+.

Syslinux 5.xx switched from the COM32 object format to much more
powerful ELF object format
that allows undefined symbols to be resolved at runtime and dynamic
loading of module
dependencies, which means modules now become shared object files
instead of statically
linked binaries - reducing both disk space and runtime memory
consumption. Furthermore
it split non-core functionality into ldlinux.c32

For more information look in the changelog under http://www.syslinux.org/wiki/

Introduce these changes in the livecd-tools package.

---
 imgcreate/live.py           | 21 +++++++++++++++++++++
 tools/livecd-iso-to-disk.sh | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/imgcreate/live.py b/imgcreate/live.py
index 87d5129..3384fe5 100755
--- a/imgcreate/live.py
+++ b/imgcreate/live.py
@@ -416,6 +416,27 @@ class x86LiveImageCreator(LiveImageCreatorBase):
         files = ["isolinux.bin", menu]
         if mboot:
             files += [mboot]
+
+        # Since Syslinux >= 5 and the switch from the COM32 object
format to ELF
+        # we need 'libcom32.c32' and 'libutil.c32' for '*menu.c32' to
work properly
+        # as well as 'ldlinux.c32' for the bootloader.
+        version = 0
+        syslinux_version = subprocess.check_output([self._instroot +
"/usr/bin/rpm", "-qi", "syslinux"])
+        if len(syslinux_version) <= 0:
+            raise CreatorError("syslinux not installed or not in rpm database")
+
+        for strings in syslinux_version.split('\n'):
+            if strings.startswith('Version'):
+                for part in strings.split(':'):
+                    if part.startswith(' '):
+                        version = int(float(part.strip()))
+                        break
+
+        if version >= 5:
+            for lib in ("libcom32.c32", "libutil.c32", "ldlinux.c32"):
+                for dir in ("/usr/lib/syslinux/", "/usr/share/syslinux/"):
+                    if os.path.isfile(self._instroot + dir + lib):
+                       files += [lib]

         for f in files:
             if os.path.exists(self._instroot + "/usr/lib/syslinux/" + f):
diff --git a/tools/livecd-iso-to-disk.sh b/tools/livecd-iso-to-disk.sh
index 0b4d2c8..7104d7c 100755
--- a/tools/livecd-iso-to-disk.sh
+++ b/tools/livecd-iso-to-disk.sh
@@ -1358,6 +1358,26 @@ if [ -z "$multi" ]; then
         cp /usr/lib/syslinux/menu.c32 $TGTMNT/$SYSLINUXPATH/menu.c32
     fi

+    # Since Syslinux >= 5 and the switch from the COM32 object format to ELF
+    # we need 'libcom32.c32' and 'libutil.c32' for '*menu.c32' to work properly
+    # as well as 'ldlinux.c32' for the bootloader.
+    syslinux_version=`/usr/bin/rpm -qi syslinux | grep Version | cut
-d ':' -f 2 | cut -d '.' -f 1`
+    if (( "$syslinux_version" >= 5 )); then
+        if [ -f /usr/share/syslinux/libcom32.c32 -a -f
/usr/share/syslinux/libutil.c32 -a -f /usr/share/syslinux/ldlinux.c32
]; then
+            cp /usr/share/syslinux/libcom32.c32
$TGTMNT/$SYSLINUXPATH/libcom32.c32
+            cp /usr/share/syslinux/libutil.c32
$TGTMNT/$SYSLINUXPATH/libutil.c32
+            cp /usr/share/syslinux/ldlinux.c32
$TGTMNT/$SYSLINUXPATH/ldlinux.c32
+        elif [ -f /usr/lib/syslinux/libcom32.c32 -a -f
/usr/lib/syslinux/libutil.c32 -a -f /usr/lib/syslinux/ldlinux.c32 ];
then
+            cp /usr/lib/syslinux/libcom32.c32
$TGTMNT/$SYSLINUXPATH/libcom32.c32
+            cp /usr/lib/syslinux/libutil.c32 $TGTMNT/$SYSLINUXPATH/libutil.c32
+            cp /usr/lib/syslinux/ldlinux.c32 $TGTMNT/$SYSLINUXPATH/ldlinux.c32
+        else
+            echo "ERROR: Cannot find 'libcom32.c32, libutil.c32,
ldlinux.c32' which are needed for Syslinux >= 5."
+            cleanup
+            exit 1
+        fi
+    fi
+
     if [ "$TGTFS" == "vfat" -o "$TGTFS" == "msdos" ]; then
         # syslinux expects the config to be named syslinux.cfg
         # and has to run with the file system unmounted
@@ -1366,6 +1386,9 @@ if [ -z "$multi" ]; then
         if [ -f $TGTMNT/$SYSLINUXPATH/ldlinux.sys ]; then
             rm -f $TGTMNT/$SYSLINUXPATH/ldlinux.sys
         fi
+        if [ -f $TGTMNT/$SYSLINUXPATH/ldlinux.c32 ]; then
+            rm -f $TGTMNT/$SYSLINUXPATH/ldlinux.c32
+        fi
         cleanup
         if [ -n "$SYSLINUXPATH" ]; then
             syslinux -d $SYSLINUXPATH $TGTDEV
@@ -1373,6 +1396,17 @@ if [ -z "$multi" ]; then
             syslinux $TGTDEV
         fi
     elif [ "$TGTFS" == "ext2" -o "$TGTFS" == "ext3" -o "$TGTFS" ==
"ext4" -o "$TGTFS" == "btrfs" ]; then
+        if (( "$syslinux_version" >= 5 )); then
+           if [ -f /boot/extlinux/libcom32.c32 -a -f
/boot/extlinux/libutil.c32 -a -f /boot/extlinux/ldlinux.c32 ]; then
+               cp /boot/extlinux/libcom32.c32
$TGTMNT/$SYSLINUXPATH/libcom32.c32
+               cp /boot/extlinux/libutil.c32 $TGTMNT/$SYSLINUXPATH/libutil.c32
+               cp /boot/extlinux/ldlinux.c32 $TGTMNT/$SYSLINUXPATH/ldlinux.c32
+           else
+               echo "ERROR: Cannot find 'libcom32.c32, libutil.c32,
ldlinux.c32' which are needed for Syslinux >= 5."
+               cleanup
+               exit 1
+           fi
+        fi
         # extlinux expects the config to be named extlinux.conf
         # and has to be run with the file system mounted
         mv $TGTMNT/$SYSLINUXPATH/isolinux.cfg
$TGTMNT/$SYSLINUXPATH/extlinux.conf
--
1.8.2



--
--joshua
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-fix-build-with-syslinux-5.patch
Type: application/octet-stream
Size: 5581 bytes
Desc: not available
URL: <http://lists.fedoraproject.org/pipermail/livecd/attachments/20130425/91e99f6f/attachment.obj>


More information about the livecd mailing list