Problems with support of file locks for ARC (maybe for other targets too)

Vineet Gupta Vineet.Gupta1 at synopsys.com
Thu Aug 11 23:38:33 UTC 2016


On 08/11/2016 09:12 AM, Yuriy Kolerov wrote:
>
>>>  Moreover the whole uClibc and every application must be compiled with
>> those macros. Here is my question. Is it acceptable just to compile toolchain
>> itself using CFLAGS_FOR_TARGET with those macros and don’t define them
>> manually in each application?
>>
>> If you enable LFS support in build system (uClibc or buildroot) these macros
>> will be automatically defined - no point or need to pass them as CFLAGS etc -
>> infact that would be wrong IMO.
> If you enable __UCLIBC_HAS_LFS__ while configuring uClibc then _LARGEFILE64_SOURCE and _FILE_OFFSET_BITS=64 will not be defined automatically. 

What was I smoking when replying ? You are correct - these macros have to be added
to each application's makefile or at top level as target C flags.

> E.g. Buildroot has this generic line in Makefile for packages:
>
> TARGET_CPPFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64

Actually BR dropped support for disabling LFS in 2015 - before that the line above
used to be guarded by BR2_LARGEFILE.

> These defines are not placed to config.h or somewhere else. They must be defined each time you compile anything. uClibc may be built by Buildroot with these flags by default (actually it is not true at least for ARC - Buildroot must be fixed but it is not a subject of this discussion). However you must define these macros manually when building every application later.

Right, I stand corrected.

> I don’t understand this thing - is it possible to compile uClibc with full support of LFS (see macros above) and don’t use this feature in applications and everything will be ok? 

Indeed this is the case - if you don't build with LFS, xxx64 won't even be
available to begin with.

> And is it possible to compile uClibc without _LARGEFILE64_SOURCE and _FILE_OFFSET_BITS=64 and compile applications with them and everything will be ok? 

This mostly likely won't work as those defines will not be present in headers to
use in application.

> Right now when we build toolchain for ARC using Buildroot uClibc is compiled without them and e.g. BusyBox is compiled with -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 ...

Buildroot now assumes LFS to be default (and you can't switch it off) so
everything including uClibc / Busybox has LFS enabled already.

>
>> So you really don't need LFS to be able to use locks - but need to make sure
>> that for common generic ABI - user struct flock pairs correctly with kernel
>> struct
>> flock64 with or w/o LFS.

But this point remains valid - for our ABI - kernel uses struct flock64 and this
needs to be binary compatible with uClibc struct flock and struct flock64 (LFS only)

Read the comment in libc/sysdeps/linux/common-generic/bits/stat.h

-Vineet


More information about the uClibc mailing list