From 474e88740a73824a2640efdddc8acf9d3c2b1206 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Tue, 2 Sep 2014 22:41:32 +0200 Subject: [PATCH 1/2] Fix CUnit test for cross-compilation The current test in configure.ac for CUnit uses AC_TRY_RUN, which doesn't work in a cross-compilation context, because we can't run on the build machine the binaries that are built for the target. In addition, the current logic assumes CUnit is available when the AC_TRY_RUN test cannot be used (e.g in a cross-compilation case). Since we actually don't care about *running* but only about testing whether a simple program include the CUnit header file and linking against the cunit library works, simply use AC_TRY_LINK() instead of AC_TRY_RUN(). Signed-off-by: Thomas Petazzoni --- configure.ac | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/configure.ac b/configure.ac index e0c06be..5e18ff4 100644 --- a/configure.ac +++ b/configure.ac @@ -91,25 +91,14 @@ if test x"$libiscsi_cv_HAVE_SOCKADDR_IN6" = x"yes"; then AC_DEFINE(HAVE_SOCKADDR_IN6,1,[Whether we have IPv6 support]) fi - AC_MSG_CHECKING(whether libcunit is available) ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$GLIB_LIBS $LIBS -lcunit" -AC_TRY_RUN([ -/* - * Just see if we can compile/link with libcunit - */ +AC_TRY_LINK([ #include - -int main(int argc, const char *argv[]) -{ - return 0; -} -], ac_cv_have_cunit=yes, ac_cv_have_cunit=no, - [echo $ac_n "compile with CUNIT. Assuming OK... $ac_c" - ac_cv_have_cunit=yes]) +], [], [ac_cv_have_cunit=yes], [ac_cv_have_cunit=no]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" if test "$ac_cv_have_cunit" = yes ; then From 80b47741c4a8b2174206cd01e3cf25ed6d74103f Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Sun, 7 Sep 2014 12:21:04 +0200 Subject: [PATCH 2/2] ld_iscsi: fix largefile related issues This commit fixes two related issues in the ld_iscsi example with largefile support. The first issue appears when building libiscsi against the glibc C library, with the flags -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64: {standard input}: Assembler messages: {standard input}:2774: Error: symbol `__fxstat64' is already defined {standard input}:2850: Error: symbol `__lxstat64' is already defined {standard input}:2938: Error: symbol `__xstat64' is already defined This is due to the fact that when _FILE_OFFSET_BITS=64 is passed, the *64() functions are defined by the C library as aliases to the non-64*() functions, because those ones directly support large files (i.e 64 bits). The second issue appears when building libiscsi against the uClibc C library, in a configuration that doesn't have largefile support. In this case, the ld_iscsi that tries to use stat64 or some other *64() functions cannot build, because such functions are not provided by the C library. Of course, ld_iscsi does not need to wrap the *64() functions in such a situation, because they do not exist. This commit fixes those problems by enclosing the *64() related code of ld_iscsi in the following compile time conditional: This ensures that the *64() function handling is here only if largefile support is available and enabled (_LARGEFILE_SOURCE64) and if non-*64() functions are not already 64 bits capable (in which case the 64*() functions are just aliases for the non-64*() ones). See also http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html for more details about the meaning of those macros. Signed-off-by: Thomas Petazzoni --- examples/ld_iscsi.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/ld_iscsi.c b/examples/ld_iscsi.c index 0cf2724..02f9d25 100644 --- a/examples/ld_iscsi.c +++ b/examples/ld_iscsi.c @@ -543,6 +543,7 @@ int dup2(int oldfd, int newfd) return real_dup2(oldfd, newfd); } +#if defined(_LARGEFILE64_SOURCE) && _FILE_OFFSET_BITS != 64 int (*real_fxstat64)(int ver, int fd, struct stat64 *buf); @@ -591,6 +592,7 @@ int __xstat64(int ver, const char *path, struct stat64 *buf) return __lxstat64(ver, path, buf); } +#endif static void __attribute__((constructor)) _init(void) { @@ -669,6 +671,7 @@ static void __attribute__((constructor)) _init(void) exit(10); } +#if defined(_LARGEFILE64_SOURCE) && _FILE_OFFSET_BITS != 64 real_fxstat64 = dlsym(RTLD_NEXT, "__fxstat64"); if (real_fxstat64 == NULL) { LD_ISCSI_DPRINTF(0,"Failed to dlsym(__fxstat64)"); @@ -683,4 +686,5 @@ static void __attribute__((constructor)) _init(void) if (real_xstat64 == NULL) { LD_ISCSI_DPRINTF(0,"Failed to dlsym(__xstat64)"); } +#endif }