在为 arm 进行交叉编译时,是否有特定的编译器标志可以使用 gcc sync-builtins?

Are there specific compiler flags to use gcc sync-builtins when cross-compiling for arm?

我正在尝试交叉编译一个使用 gcc 内置函数的程序,特定于 __sync_val_compare_and_swap、__sync_add_and_fetch 和 sync_sub_and_fetch。 编译工作,但 linker 向我显示未定义的引用错误。 例如:

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 版本。

我也尝试手动 link 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);
}

我是否需要提供一些特殊的编译器标志或定义以便可以 linked 内置函数?

正如@KamiCuk 所指出的,我必须自己实现所需的功能。 他评论中的 disable_intterrups() 和 enable_interrupts() 函数是 os 依赖的。当我为 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) 已经提供了一些原子操作。