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

时间:2019-10-15 11:15:53

标签: c gcc arm stm32 freertos

我正在尝试交叉编译使用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);
}

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

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)已经提供了一些原子操作。