Make libelf support optional

This commit is contained in:
Richard Hughes 2016-11-22 15:39:57 +00:00
parent 39148003a7
commit 1deda31cae
3 changed files with 51 additions and 1 deletions

View File

@ -145,7 +145,6 @@ PKG_CHECK_MODULES(APPSTREAM_GLIB, appstream-glib >= 0.5.10)
PKG_CHECK_MODULES(GUSB, gusb >= 0.2.9) PKG_CHECK_MODULES(GUSB, gusb >= 0.2.9)
PKG_CHECK_MODULES(SQLITE, sqlite3) PKG_CHECK_MODULES(SQLITE, sqlite3)
PKG_CHECK_MODULES(ARCHIVE, libarchive) PKG_CHECK_MODULES(ARCHIVE, libarchive)
PKG_CHECK_MODULES(ELF, libelf)
PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.51.92) PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.51.92)
AC_PATH_PROG(DOCBOOK2MAN, docbook2man) AC_PATH_PROG(DOCBOOK2MAN, docbook2man)
if test -z $DOCBOOK2MAN ; then if test -z $DOCBOOK2MAN ; then
@ -177,6 +176,27 @@ else
fi fi
AM_CONDITIONAL(HAVE_COLORHUG, test x$has_colorhug = xyes) AM_CONDITIONAL(HAVE_COLORHUG, test x$has_colorhug = xyes)
# libelf support
AC_ARG_ENABLE(libelf,
AS_HELP_STRING([--enable-libelf],
[Enable libelf support [default=auto]]),,
enable_libelf=maybe)
if test x$enable_libelf != xno; then
PKG_CHECK_MODULES(LIBELF, libelf >= 1.2.12,
has_libelf=yes,
has_libelf=no)
fi
if test x$has_libelf = xyes; then
AC_DEFINE(HAVE_LIBELF,1,[Use libelf support])
else
has_libelf=no
if test "x$enable_libelf" = "xyes"; then
AC_MSG_ERROR([libelf support requested but 'libelf' was not found])
fi
fi
AM_CONDITIONAL(HAVE_LIBELF, test x$has_libelf = xyes)
# gpgme support # gpgme support
AC_MSG_CHECKING([for gpgme]) AC_MSG_CHECKING([for gpgme])
if ! test -x "/usr/bin/gpgme-config"; then if ! test -x "/usr/bin/gpgme-config"; then
@ -320,6 +340,7 @@ echo "
optional providers optional providers
------------------ ------------------
Colorhug: $has_colorhug Colorhug: $has_colorhug
libelf: $has_libelf
UEFI: $has_fwup UEFI: $has_fwup
Dell: $has_dell Dell: $has_dell
" "

View File

@ -24,8 +24,12 @@
#include <fcntl.h> #include <fcntl.h>
#include <gelf.h> #include <gelf.h>
#include <gio/gunixinputstream.h> #include <gio/gunixinputstream.h>
#ifdef HAVE_LIBELF
#include <libelf.h> #include <libelf.h>
#include <linux/memfd.h> #include <linux/memfd.h>
#endif
#include <string.h> #include <string.h>
#include <sys/syscall.h> #include <sys/syscall.h>
@ -60,6 +64,7 @@ dfu_firmware_detect_elf (GBytes *bytes)
return DFU_FIRMWARE_FORMAT_ELF; return DFU_FIRMWARE_FORMAT_ELF;
} }
#ifdef HAVE_LIBELF
static DfuElement * static DfuElement *
_get_element_from_section_name (Elf *e, const gchar *desired_name) _get_element_from_section_name (Elf *e, const gchar *desired_name)
{ {
@ -144,6 +149,7 @@ dfu_format_elf_symbols_from_symtab (DfuFirmware *firmware, Elf *e)
} }
} }
} }
#endif
/** /**
* dfu_firmware_from_elf: (skip) * dfu_firmware_from_elf: (skip)
@ -162,6 +168,7 @@ dfu_firmware_from_elf (DfuFirmware *firmware,
DfuFirmwareParseFlags flags, DfuFirmwareParseFlags flags,
GError **error) GError **error)
{ {
#ifdef HAVE_LIBELF
guint i; guint i;
guint sections_cnt = 0; guint sections_cnt = 0;
g_autoptr(Elf) e = NULL; g_autoptr(Elf) e = NULL;
@ -230,8 +237,16 @@ dfu_firmware_from_elf (DfuFirmware *firmware,
/* success */ /* success */
return TRUE; return TRUE;
#else
g_set_error_literal (error,
DFU_ERROR,
DFU_ERROR_INTERNAL,
"compiled without libelf support");
return FALSE;
#endif
} }
#ifdef HAVE_LIBELF
static int static int
_memfd_create (const char *name, unsigned int flags) _memfd_create (const char *name, unsigned int flags)
{ {
@ -299,6 +314,7 @@ dfu_format_elf_pack_image (Elf *e, DfuImage *image, GError **error)
} }
return dfu_format_elf_pack_element (e, element, error); return dfu_format_elf_pack_element (e, element, error);
} }
#endif
/** /**
* dfu_firmware_to_elf: (skip) * dfu_firmware_to_elf: (skip)
@ -312,6 +328,7 @@ dfu_format_elf_pack_image (Elf *e, DfuImage *image, GError **error)
GBytes * GBytes *
dfu_firmware_to_elf (DfuFirmware *firmware, GError **error) dfu_firmware_to_elf (DfuFirmware *firmware, GError **error)
{ {
#ifdef HAVE_LIBELF
DfuImage *image; DfuImage *image;
Elf32_Ehdr *ehdr; Elf32_Ehdr *ehdr;
Elf32_Shdr *shdr; Elf32_Shdr *shdr;
@ -446,4 +463,11 @@ dfu_firmware_to_elf (DfuFirmware *firmware, GError **error)
return NULL; return NULL;
} }
return g_input_stream_read_bytes (stream, fsize, NULL, error); return g_input_stream_read_bytes (stream, fsize, NULL, error);
#else
g_set_error_literal (error,
DFU_ERROR,
DFU_ERROR_INTERNAL,
"compiled without libelf support");
return FALSE;
#endif
} }

View File

@ -362,6 +362,11 @@ dfu_firmware_elf_func (void)
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
g_autoptr(GFile) file = NULL; g_autoptr(GFile) file = NULL;
#ifndef HAVE_LIBELF
g_test_skip ("compiled without libelf support");
return;
#endif
/* load a ELF firmware */ /* load a ELF firmware */
filename = dfu_test_get_filename ("example.elf"); filename = dfu_test_get_filename ("example.elf");
g_assert (filename != NULL); g_assert (filename != NULL);