On 8 December 2012 08:49, Vineet Gupta <[email protected]> wrote: > On Saturday 08 December 2012 12:22 PM, Vineet Gupta wrote: >> On Monday 26 November 2012 07:54 PM, Markos Chandras wrote: >>> From: Markos Chandras <[email protected]> >>> >>> Signed-off-by: Markos Chandras <[email protected]> >>> --- >>> libc/sysdeps/linux/common/ftruncate.c | 9 +++++++++ >>> 1 file changed, 9 insertions(+) >>> >>> diff --git a/libc/sysdeps/linux/common/ftruncate.c >>> b/libc/sysdeps/linux/common/ftruncate.c >>> index 3bdef3f..72f86f9 100644 >>> --- a/libc/sysdeps/linux/common/ftruncate.c >>> +++ b/libc/sysdeps/linux/common/ftruncate.c >>> @@ -11,5 +11,14 @@ >>> #include <unistd.h> >>> >>> >>> +#if defined(__NR_ftruncate64) && !defined(__NR_ftruncate) >>> +int ftruncate(int fd, __off_t length) >>> +{ >>> + return ftruncate64(fd, length); >>> +} >>> +libc_hidden_def(ftruncate); >>> + >>> +#else >>> _syscall2(int, ftruncate, int, fd, __off_t, length) >>> libc_hidden_def(ftruncate) >>> +#endif >>> >> In my local tests this fails with uClibc w/o LFS because ftruncate64() >> is only defined for LFS. Same goes for truncate64 and lseek64. >> So your libc (non LFS) will build fine but will have undefined refs >> which will show up when linking the app. >> >> arc-linux-uclibc-nm -u lib/libc.so.0 >> ... >> U ftruncate64 >> U lseek64 >> U truncate64 >> >> There are 2 approaches to fix this - either fix the __UCLIBC_HAS_LFS__ >> gaurd in ftruncate64.c (and friends) or replicate the logic in >> fruncate.c - which gets messy given that we need to handle both WORDSIZE >> 32 and 64. > > Following works for me ! > int ftruncate(int fd, __off_t length) > { > #if defined __UCLIBC_HAS_LFS__ > return ftruncate64(fd, length); > #elif __WORDSIZE == 32 > uint32_t high = 0; > return INLINE_SYSCALL(ftruncate64, 3, fd, > __LONG_LONG_PAIR (high, length)); > /* No need to handle __WORDSIZE == 64 as kernel won't define > __NR_ftruncate64 */ > #endif > }
Hi Vineet, Yes I already said that uClibc does not build without LFS on the other thread. The fix looks reasonable to me (probably similar fixes for the other syscalls apply too, except for the getdents one that looks a bit complicated.) However, I am affraid that the code might become a bit unreadable with all the #if/#def mess. Another "workaround" for this is new architectures to always "select UCLIBC_HAS_LFS" in ther Kconfig files. -- Regards, Markos _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
