[libcamera-devel] [PATCH] src/libcamera/meson.build: link with atomic when needed

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Sep 9 12:42:00 CEST 2019


Hi Laurent,

On 09/09/2019 00:01, Laurent Pinchart wrote:
> Hi Kieran,
> 
> On Fri, Sep 06, 2019 at 02:50:38PM +0100, Kieran Bingham wrote:
>> On 05/09/2019 20:04, Fabrice Fontaine wrote:
>>> On some architectures, atomic binutils are provided by the libatomic
>>> library from gcc. Linking with libatomic is therefore necessary,
>>> otherwise the build fails with:
>>>
>>> /home/buildroot/autobuild/run/instance-3/output/host/opt/ext-toolchain/bin/../lib/gcc/sparc-buildroot-linux-uclibc/7.4.0/../../../../sparc-buildroot-linux-uclibc/bin/ld: src/libcamera/4ab8042@@camera at sha/v4l2_videodevice.cpp.o: in function `libcamera::V4L2VideoDevice::queueBuffer(libcamera::Buffer*)':
>>> v4l2_videodevice.cpp:(.text+0x1470): undefined reference to `__atomic_fetch_add_4'
>>>
>>> This is often for example the case on sparc v8 32 bits.
>>>
>>> Fixes:
>>>  - http://autobuild.buildroot.org/results/1f0b8338f5f39aa86b9d432598dae2f53c5f7c84
>>>
>>> Signed-off-by: Fabrice Fontaine <fontaine.fabrice at gmail.com>
>>> ---
>>>  src/libcamera/meson.build | 1 +
>>>  1 file changed, 1 insertion(+)
>>>
>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
>>> index c5d8f11..0706a08 100644
>>> --- a/src/libcamera/meson.build
>>> +++ b/src/libcamera/meson.build
>>> @@ -99,6 +99,7 @@ version_cpp = vcs_tag(command : [gen_version, meson.build_root()],
>>>  libcamera_sources += version_cpp
>>>  
>>>  libcamera_deps = [
>>> +    cc.find_library('atomic', required: false),
>>
>> Interestingly, this adds the following clear message when I build on x86:
>>
>> Library atomic found: YES
>>
>> So - my system finds 'libatomic' and now explicitly adds it as the
>> dependencies. (I assumed it was a gcc builtin, for it not to be necessary)
>>
>> I wondered if this caused any ill-effect, but actually I believe this is
>> perfectly safe. Thanks to using meson we have reproducible builds, and I
>> can see that both with and without this explicit linking we get
>> identical output binaries for libcamera.so
> 
> Is that because the linker doesn't find any symbol in libatomic.so that
> are required by libcamera, and thus skips it ?

Perhaps, it could likely be that the necessary intrinsics are provided
by GCC so those get used with precedence, and then there's nothing left
to link to libatomic.


>> With that, and seeing the libcamera tests pass (which is not surprising
>> with no binary change - I've ensured that the git sha1 did not change
>> between builds) then I believe this is a good fix to support the broken
>> compile issues reported.
>>
>> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>
>> I'll give the others a chance to provide any feedback if necessary and
>> then we can push this into the master branch, and then get buildroot
>> package building the latest version.
> 
> I was initially a bit worried that we would link to libatomic.so
> unnecessarily, or that it would break on platforms not providing
> libatomic.so, but as all that seems fine,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
> Out of curiosity I still would like to know what code in V4L2VideoDevice
> generates atomic calls.

In our master branch, nothing in V4L2VideoDevice. That object file now
compiles cleanly..

In master the only link error point on sparc is:

src/libcamera/4ab8042@@camera at sha/message.cpp.o: In function
`libcamera::Message::registerMessageType()':
message.cpp:(.text+0x178): undefined reference to `__atomic_fetch_add_4'
collect2: error: ld returned 1 exit status

Which is due to the following function:

 Message::Type Message::registerMessageType()
 {
        return static_cast<Message::Type>(nextUserType_++);
 }

Thus - I believe this resolution is still required.



Buildroot is currently still building from:

caf25dc5cfd1 ("libcamera: event_dispatcher_poll: Remove struct keyword
from for-range")


At that commit, in V4L2VideoDevice::queueBuffer() we do a:

	if (queuedBuffersCount_++ == 0)
        	fdEvent_->setEnabled(true);

and in V4L2VideoDevice::dequeueBuffer() we have:

        if (--queuedBuffersCount_ == 0)
                fdEvent_->setEnabled(false);

I believe these are the cause of the atomic references.


Now the only issue is that we have picked up other build errors in
master since this commit in regards to O_TMPFILE usage. <sigh>


But I believe that's separate to this issue, and I believe we are good
to apply this fix.


>>>      cc.find_library('dl'),
>>>      libudev,
>>>      dependency('threads'),
>>>
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list