我正在尝试交叉编译使用gcc内置函数,特定于__sync_val_compare_and_swap,__ sync_add_and_fetch和sync_sub_and_fetch的程序。 编译有效,但链接器向我显示了未定义的参考错误。 例如:
memory_layout.c:(.text.memory_uniqueid+0x1c): undefined reference to '__sync_val_compare_and_swap_4'
memory_layout.c:(.text.ipc_counter+0x18): undefined reference to '__sync_add_and_fetch_4'
我正在使用eclipse和SW4STM32随附的st-gnu-arm-gcc-7-2018-q2-update_gdb-5_4-2016q3工具链。我的主机是64位Linux Mint。该程序是使用CMake构建的。
所需的功能在工具链文件lib / gcc / arm-none-eabi / 7.3.1 / plugin / include / sync-builtins.def中定义。
我已经搜索了类似的错误,但是提供了解决方案(使用-march = i486),但这没有帮助。 我发现的另一个解决方法是在自己的库(http://vincesoft.blogspot.com/2012/04/how-to-solve-undefined-reference-to.html)中编译所需的函数,但这似乎适用于较旧的gcc版本。
我还尝试手动链接libgcc(工具链随附),但没有成功。使用的命令是
add_library(GCC_LIB STATIC IMPORTED /home/toolchains/st-gnu-arm-gcc-7-2018-q2-update_gdb-5_4-2016q3/lib/gcc/arm-none-eabi/7.3.1/libgcc.a)
target_link_libraries(${PROJECT_NAME} ${GCC_LIB})
该错误是由以下功能引起的
static inline unsigned int atomic_inc(unsigned int v)
{
/* atomic load, modify, store */
return __sync_add_and_fetch(v, 1);
}
我是否需要提供一些特殊的编译器标志或定义,以便可以链接内置函数?
答案 0 :(得分:0)
正如@KamiCuk指出的那样,我必须自己实现所需的功能。 他的注释中的disable_intterrups()和enable_interrupts()函数取决于操作系统。在为Freertos进行编译时,我使用了portENTER_CRITICAL和portEXIT_CRITICAL。 __sync_add_and_fetch_4的最终解决方案如下:
__sync_add_and_fetch_4(unsigned *v, unsigned add, ...) {
portENTER_CRITICAL();
const unsigned ret = *v;
*v += add;
portEXIT_CRITICAL();
return ret; }
FreeRTOS标头(atomic.h)已经提供了一些原子操作。