Elektrobit / cmocka_extensions

Collection of mocking related code extensions needed by other components
https://elos-logger.org/
MIT License
0 stars 1 forks source link

Build fails when LTO is enable #1

Open ahresse opened 2 months ago

ahresse commented 2 months ago

While packaging cmocka_extensions for debian, I enabled LTO. However, I encountered some issues while doing so.

Here is how I enable LTO for cmake:

ahresse@local:~/Developments/elektrobit/cmocka_extensions(main)$ git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5eff128..ae0a190 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.21)
 include(cmake/project.cmake)
 project(cmocka_extensions LANGUAGES C VERSION ${CMOCKA_EXTENSIONS_VERSION})

+set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+
 list(APPEND CMAKE_PREFIX_PATH "${INSTALL_DIR}/usr/local/lib/cmake")

 project_set_environment()

Here is the error I get:

ahresse@local:~/Developments/elektrobit/cmocka_extensions(main)$ cmake -B ./build ./
-- -- Set version for cmocka_extensions: 0.50.0.42751eb
-- Create weak library selfref_static_weak
-- Create weak library extref_dependency_static_weak
-- create mock_extref_dependency
-- create mock_selfref
-- Create unit test weak_selfref_example for utest
-- Create unit test weak_extref_example for extref
-- Create unit test wrap_extref_example for extref
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ahresse/Developments/elektrobit/cmocka_extensions/build
ahresse@local:~/Developments/elektrobit/cmocka_extensions(main)$ make -C ./build/ all
make: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[1]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target selfref
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[  3%] Building C object examples/src/self_referencing/CMakeFiles/selfref.dir/selfref.c.o
[  7%] Linking C shared library libselfref.so
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[  7%] Built target selfref
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target selfref_static
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 10%] Building C object examples/src/self_referencing/CMakeFiles/selfref_static.dir/selfref.c.o
[ 14%] Linking C static library libselfref_static.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 14%] Built target selfref_static
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target extref_library
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 17%] Building C object examples/src/extref_library/CMakeFiles/extref_library.dir/library.c.o
[ 21%] Linking C shared library libextref_library.so
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 21%] Built target extref_library
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target extref_library_static
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 25%] Building C object examples/src/extref_library/CMakeFiles/extref_library_static.dir/library.c.o
[ 28%] Linking C static library libextref_library_static.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 28%] Built target extref_library_static
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target extref_dependency
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 32%] Building C object examples/src/extref_dependency/CMakeFiles/extref_dependency.dir/dependency.c.o
[ 35%] Linking C shared library libextref_dependency.so
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 35%] Built target extref_dependency
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target extref_dependency_static
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 39%] Building C object examples/src/extref_dependency/CMakeFiles/extref_dependency_static.dir/dependency.c.o
[ 42%] Linking C static library libextref_dependency_static.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 42%] Built target extref_dependency_static
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 46%] Generating libextref_dependency_static_weak.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 46%] Built target extref_dependency_static_weak_builder
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target mock_extref_dependency_static
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 50%] Building C object examples/test/utest/mocks/extref_dependency/CMakeFiles/mock_extref_dependency_static.dir/mock_extref_dependency.c.o
[ 53%] Linking C static library libmock_extref_dependency_static.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 53%] Built target mock_extref_dependency_static
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target mock_extref_dependency
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 57%] Building C object examples/test/utest/mocks/extref_dependency/CMakeFiles/mock_extref_dependency.dir/mock_extref_dependency.c.o
[ 60%] Linking C shared library libmock_extref_dependency.so
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 60%] Built target mock_extref_dependency
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 64%] Generating libselfref_static_weak.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 64%] Built target selfref_static_weak_builder
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target mock_selfref_static
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 67%] Building C object examples/test/utest/mocks/selfref/CMakeFiles/mock_selfref_static.dir/mock_selfref.c.o
[ 71%] Linking C static library libmock_selfref_static.a
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 71%] Built target mock_selfref_static
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target mock_selfref
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 75%] Building C object examples/test/utest/mocks/selfref/CMakeFiles/mock_selfref.dir/mock_selfref.c.o
[ 78%] Linking C shared library libmock_selfref.so
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 78%] Built target mock_selfref
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
Consolidate compiler generated dependencies of target weak_selfref_example
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[2]: Entering directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
[ 82%] Building C object examples/test/utest/selfref/CMakeFiles/weak_selfref_example.dir/example.c.o
[ 85%] Linking C executable weak_selfref_example
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/libasan.so: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/libasan.so: warning: the use of `tempnam' is dangerous, better use `mkstemp'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/libasan.so: warning: the use of `tmpnam_r' is dangerous, better use `mkstemp'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/libasan.so: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/libasan.so: warning: the use of `tempnam' is dangerous, better use `mkstemp'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/libasan.so: warning: the use of `tmpnam_r' is dangerous, better use `mkstemp'
/usr/bin/ld: /tmp/ccWYvPTh.ltrans0.ltrans.o: in function `function':
/home/ahresse/Developments/elektrobit/cmocka_extensions/examples/test/utest/mocks/selfref/mock_selfref.c:11: undefined reference to `__real_function'
collect2: error: ld returned 1 exit status
make[2]: *** [examples/test/utest/selfref/CMakeFiles/weak_selfref_example.dir/build.make:100: examples/test/utest/selfref/weak_selfref_example] Error 1
make[2]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make[1]: *** [CMakeFiles/Makefile2:684: examples/test/utest/selfref/CMakeFiles/weak_selfref_example.dir/all] Error 2
make[1]: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
make: *** [Makefile:136: all] Error 2
make: Leaving directory '/home/ahresse/Developments/elektrobit/cmocka_extensions/build'
gehwolf commented 2 months ago

Hi,

thanks for the report. I will try to reproduce the issue myself and come back here if I have an idea how we can solve this issue.

The libasan can be ignored or removed by disabling the address sanitizer.

The undefined reference looks interesting:

/usr/bin/ld: /tmp/ccWYvPTh.ltrans0.ltrans.o: in function `function':
/home/ahresse/Developments/elektrobit/cmocka_extensions/examples/test/utest/mocks/selfref/mock_selfref.c:11: undefined reference to `__real_function'
collect2: error: ld returned 1 exit status
gehwolf commented 2 months ago

Hi Alexandre,

we won't be able to get the mocking framework for LTO in the foreseeable future, if that is possible at all. My suggestion is to disable it here. Currently the examples are failing to compile and I think we do not need to package the examples. So we need a CMake option to disable the examples and build a header only package .

In general in all depended packages the LTO feature shall only be turned on for building the actual result like a executable or a shared library. For the unit tests this option should be skipped.

BR

Wolfgang