Skip to content

Fix __atomic_load_8 issue on Raspberry Pi 32-bit Debian OS#24031

Closed
Qengineering wants to merge 1 commit intoopencv:4.xfrom
Qengineering:4.x
Closed

Fix __atomic_load_8 issue on Raspberry Pi 32-bit Debian OS#24031
Qengineering wants to merge 1 commit intoopencv:4.xfrom
Qengineering:4.x

Conversation

@Qengineering
Copy link
Copy Markdown

Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

  • I agree to contribute to the project under Apache 2 License.
  • To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
  • The PR is proposed to the proper branch
  • There is a reference to the original bug report and related work
  • There is accuracy test, performance test and test data in opencv_extra repository, if applicable
    Patch to opencv_extra has the same branch name.
  • The feature is well documented and sample code can be built with the project CMake

When OpenCV is build on a Raspberry Pi with a 32-bit Debian OS, it errors with undefined reference to '__atomic_load_8'
The problem is the linkage of calib3d. Somehow it doesn't pull in libatomic.so.
By incorporating ${CMAKE_SHARED_LINKER_FLAGS} into the CMakeList.txt this library is explicitly used in the build.
Of course, the build must flag -D CMAKE_SHARED_LINKER_FLAGS=-latomic.
See also #Failed to install on Raspberry Pi (ARM) 32 bit

@asmorkalov
Copy link
Copy Markdown
Contributor

WRAP java objc python js
)
ocv_target_link_libraries(${the_module} ${LAPACK_LIBRARIES})
ocv_target_link_libraries(${the_module} ${LAPACK_LIBRARIES} ${CMAKE_SHARED_LINKER_FLAGS})
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is wrong change:

  • shared libraries build should already have these flags automatically
  • static libraries build goes broken due to mess with shared flags.

@asmorkalov asmorkalov added category: build/install platform: arm ARM boards related issues: RPi, NVIDIA TK/TX, etc labels Jul 20, 2023
@Qengineering
Copy link
Copy Markdown
Author

I am familiar with the related issues. I've read them all and tried every suggested solution.Nothing solved the problem.
I'm still getting __atomic_load_8 missing errors in calib3d's link. The linker doesn't use libatomic here.
Only on a Raspberry Pi with a 32-bit Debian. Not the 64-bit, not with Ubuntu etc, etc.

In the end, the only thing that worked was this indeed this not-so-nice solution.
I would be more than happy if there is a neater solution.

@opencv-alalek
Copy link
Copy Markdown
Contributor

and tried every suggested solution

Need to debug/investigate why these fixes don't work in your build configuration first.

Use cmake ... --trace-expand -DCMAKE_TRACE_MODE=1 -DCMAKE_EXPORT_COMPILE_COMMANDS=1 for that.

@Qengineering
Copy link
Copy Markdown
Author

Qengineering commented Jul 21, 2023

@opencv-alalek,

As requested, build with cmake ... --trace-expand -DCMAKE_TRACE_MODE=1 -DCMAKE_EXPORT_COMPILE_COMMANDS=1
The JSON for ransac

{
  "directory": "/home/pi/opencv/build/modules/calib3d",
  "command": "/usr/bin/c++ -DCVAPI_EXPORTS -D_USE_MATH_DEFINES -D__OPENCV_BUILD=1 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/pi/opencv/build -I/home/pi/opencv/modules/calib3d/include -I/home/pi/opencv/build/modules/calib3d -I/home/pi/opencv/modules/core/include -I/home/pi/opencv/modules/flann/include -I/home/pi/opencv/modules/imgproc/include -I/home/pi/opencv/modules/features2d/include    -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wno-psabi -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -fopenmp -O3 -DNDEBUG  -DNDEBUG -fPIC -std=c++11 -o CMakeFiles/opencv_calib3d.dir/src/usac/ransac_solvers.cpp.o -c /home/pi/opencv/modules/calib3d/src/usac/ransac_solvers.cpp",
  "file": "/home/pi/opencv/modules/calib3d/src/usac/ransac_solvers.cpp"
},

It outputs at 59% with:

Scanning dependencies of target opencv_calib3d
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/ap3p.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/calibinit.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/calibration.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/calibration_handeye.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/checkchessboard.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/chessboard.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/circlesgrid.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/compat_ptsetreg.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/dls.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/epnp.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/fisheye.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/five-point.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/fundam.cpp.o
[ 57%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/homography_decomp.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/ippe.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/levmarq.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/main.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/p3p.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/polynom_solver.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/posit.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/ptsetreg.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/quadsubpix.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/rho.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/solvepnp.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/sqpnp.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/stereobm.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/stereosgbm.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/triangulate.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/undistort.dispatch.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/upnp.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/bundle.cpp.o
[ 58%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/degeneracy.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/dls_solver.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/essential_solver.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/estimator.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/fundamental_solver.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/gamma_values.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/homography_solver.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/local_optimization.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/pnp_solver.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/quality.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/ransac_solvers.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/sampler.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/termination.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/src/usac/utils.cpp.o
[ 59%] Building CXX object modules/calib3d/CMakeFiles/opencv_calib3d.dir/opencl_kernels_calib3d.cpp.o
[ 59%] Linking CXX shared library ../../lib/libopencv_calib3d.so
/usr/bin/ld: CMakeFiles/opencv_calib3d.dir/src/usac/ransac_solvers.cpp.o: in function `cv::usac::Ransac::run(cv::Ptr<cv::usac::RansacOutput>&)::{lambda(cv::Range const&)#3}::operator()(cv::Range const&) const::{lambda(cv::usac::Score const&, cv::Mat const&, bool)#1}::operator()(cv::usac::Score const, cv::Mat const, bool) const':
ransac_solvers.cpp:(.text._ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b[_ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b]+0x44): undefined reference to `__atomic_load_8'
/usr/bin/ld: ransac_solvers.cpp:(.text._ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b[_ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b]+0x74): undefined reference to `__atomic_load_8'
/usr/bin/ld: ransac_solvers.cpp:(.text._ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b[_ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b]+0x400): undefined reference to `__atomic_store_8'
/usr/bin/ld: ransac_solvers.cpp:(.text._ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b[_ZZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_ENKUlRKNS0_5ScoreERKNS_3MatEbE_clESC_SF_b]+0x420): undefined reference to `__atomic_load_8'
/usr/bin/ld: CMakeFiles/opencv_calib3d.dir/src/usac/ransac_solvers.cpp.o: in function `cv::usac::Ransac::run(cv::Ptr<cv::usac::RansacOutput>&)::{lambda(cv::Range const&)#3}::operator()(cv::Range const&) const [clone .isra.0]':
ransac_solvers.cpp:(.text._ZZN2cv4usac6Ransac3runERNS_3PtrINS0_12RansacOutputEEEENKUlRKNS_5RangeEE1_clES8_.isra.0[_ZNSt17_Function_handlerIFvRKN2cv5RangeEEZNS0_4usac6Ransac3runERNS0_3PtrINS5_12RansacOutputEEEEUlS3_E1_E9_M_invokeERKSt9_Any_dataS3_]+0xfac): undefined reference to `__atomic_load_8'
collect2: error: ld returned 1 exit status
make[2]: *** [modules/calib3d/CMakeFiles/opencv_calib3d.dir/build.make:788: lib/libopencv_calib3d.so.4.8.0] Error 1
make[1]: *** [CMakeFiles/Makefile2:5463: modules/calib3d/CMakeFiles/opencv_calib3d.dir/all] Error 2
make: *** [Makefile:182: all] Error 2

I hope it gives you the clue on how to solve the issue.
If more information is needed, I'm more than happy to comply.

@opencv-alalek
Copy link
Copy Markdown
Contributor

Output of cmake configure step should be captured (... >trace.txt 2>&1) and analyzed.
Verify code flow of added lines into cmake/OpenCVDetectCXXCompiler.cmake here: https://github.com/opencv/opencv/pull/15353/files

Try to run cmake configure stage with -DOPENCV_FORCE_LIBATOMIC_COMPILER_CHECK=1 and compare traces (both shuold be collected from the clean build directory to avoid cmake cache involvement).

Also please grab full linker command line options for libopencv_calib3d.so, e.g. run make VERBOSE=1

@Qengineering
Copy link
Copy Markdown
Author

@opencv-alalek,

The -DOPENCV_FORCE_LIBATOMIC_COMPILER_CHECK=1 did the trick.
Without FORCE cmake generates :

Line 181140: /home/pi/opencv/cmake/OpenCVUtils.cmake(1479):  target_link_libraries(opencv_calib3d PRIVATE;dl;m;pthread;rt;tegra_hal )

With FORCE cmake generates :

Line 181576: /home/pi/opencv/cmake/OpenCVUtils.cmake(1479):  target_link_libraries(opencv_calib3d PRIVATE;atomic;dl;m;pthread;rt;tegra_hal )

The atomic lib is linked in the last call.

What to do?
The suggested pull request is no longer valid.
Leave it and give some extra information on the website concerning this flag.
Or is somebody modifying the OpenCV Detect Compiler.cmake?

@opencv-alalek
Copy link
Copy Markdown
Contributor

@Qengineering Thank you for the check.

FORCE flag is a "last chance" workaround.

Perhaps condition doesn't pass because this flag is not enabled OPENCV_ENABLE_ATOMIC_LONG_LONG here:
https://github.com/opencv/opencv/blame/4.8.0/cmake/OpenCVDetectCXXCompiler.cmake#L230

OPENCV_ENABLE_ATOMIC_LONG_LONG is optional by design and it is disabled almost anywhere except x86 (atomic<long long> could be slow on some platforms)

Regression is introduced in calib3d module which uses std::atomic<double> unconditionally: #23078
Need to revise atomic usage in OpenCV.

/cc @asmorkalov @ivashmak

@opencv-alalek
Copy link
Copy Markdown
Contributor

Opened issue: #24281
Closing this PR as fix is not valid and we need another solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

category: build/install platform: arm ARM boards related issues: RPi, NVIDIA TK/TX, etc

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants