[Buildroot] [PATCH] Raspberry Pi - WiringPi Library Package

Guillermo Amaral g at maral.me
Thu Jul 11 17:55:30 UTC 2013


Howdy Carsten,

On Thu, Jul 11, 2013 at 09:42:28AM +0200, Carsten Schoenert wrote:
> Hello Guillermo,
> 
> Am 11.07.2013 08:38, schrieb Guillermo A. Amaral:
> > I searched around for alternative ways around the issue when I first
> > encountered it, it seemed no-oping it would be most portable/safest approach.
> 
> The O_CLOEXEC variable was introduced in 2.6.23.
> 
> >        O_CLOEXEC (Since Linux 2.6.23)
> >               Enable the close-on-exec flag for the new file descriptor.
> >               Specifying this flag permits a program to avoid additional
> >               fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag.
> >               Additionally, use of this flag is essential in some
> >               multithreaded programs since using a separate fcntl(2) F_SETFD
> >               operation to set the FD_CLOEXEC flag does not suffice to avoid
> >               race conditions where one thread opens a file descriptor at
> >               the same time as another thread does a fork(2) plus execve(2).
> 
> So if you use a kernel less then 2.6.23 it make no sense to definess then 2.6.23 it make no sense to define
> O_CLOEXEC to whatever you want, the kernel doesn't know this. And in the
> opposite you can't defined it to some different then already defined for
> O_CLOEXEC.
>
> The function 'open' can also used without the 3rd parameter.
> 
> So I think you have to check which kernel version is used and build a
> patch which does something like
> 
> #ifdef KERNEL_VER < 2_6_23
>   if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0)
> #else
>   if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
> #endif
>
> The guys from linux-wireless do a lot of this to get the wireless
> package working om dif

The Raspberry Pi doesn't go down to 2.6.y, the oldest supported version is
3.2.27. :)

So there should be no need to do the kernel check, since the package is RPi
specific.

The problem here was that O_CLOEXEC was not defined with the default uclibc
and older versions of glibc.

Cheers,
G

-- 
gamaral http://about.me/gamaral


More information about the buildroot mailing list