![Vicente Olivert Riera](/assets/img/avatar_default.png)
Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
84 lines
2.9 KiB
Diff
84 lines
2.9 KiB
Diff
From b77db7fa6cd00e1412fdd186180996f8d622b275 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
Date: Sun, 7 Sep 2014 12:21:04 +0200
|
|
Subject: [PATCH 5/5] 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 <thomas.petazzoni@free-electrons.com>
|
|
---
|
|
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
|
|
}
|
|
--
|
|
2.0.0
|
|
|