簡體   English   中英

GCC 沒有找到內置的“memcpy”

[英]GCC is not finding the built-in 'memcpy'

我正在使用 GCC 的arm-none-eabi版本在 ARM Cortex-M微控制器上工作。 我也在使用-fnostdlib-fnostdin

在我的代碼中,我使用memcpystrlen 根據 GCC 手冊,這兩個函數都是內置函數。 當我按原樣或__buitin_...使用這些 function 時,我得到undefined reference to...

為什么 GCC 沒有按預期生成代碼?

內置函數不是真正的函數。 編譯器可以用“正常”的 function 調用來替換它們。 ARM b 如本例所示:

void *m(void *a, void *b, size_t size)
{
    return __builtin_memcpy(a,b,size);
}

void *m1(void *a, void *b)
{
    return __builtin_memcpy(a,b,16);
}

void *m2(void *a, void *b)
{
    return __builtin_memcpy(a,b,200);
}


volatile int a[1000],b[10000], c[1000];


int main(void)
{
    m((void *)a,(void *)b,16);
    __asm(":::m");
    m((void *)a,(void *)c,400);
}

生成的代碼將取決於 ARM 架構(如果未對齊訪問是合法的)。

CORTEX-M4                                            CORTEX-M0
m:                                                   m:
  b memcpy                                                   push    {r4, lr}
m1:                                                          bl      memcpy
  push {r4, r5}                                              pop     {r4, pc}
  ldr r5, [r1] @ unaligned                           m1:
  ldr r4, [r1, #4] @ unaligned                               push    {r4, lr}
  ldr r2, [r1, #8] @ unaligned                               movs    r2, #16
  ldr r1, [r1, #12] @ unaligned                              bl      memcpy
  str r1, [r0, #12] @ unaligned                              pop     {r4, pc}
  str r5, [r0] @ unaligned                           m2:
  str r4, [r0, #4] @ unaligned                               push    {r4, lr}
  str r2, [r0, #8] @ unaligned                               movs    r2, #200
  pop {r4, r5}                                               bl      memcpy
  bx lr                                                      pop     {r4, pc}
m2:                                                  main:
  movs r2, #200                                              ldr     r0, .L6
  b memcpy                                                   push    {r4, r5, r6, lr}
main:                                                        movs    r2, r0
  push {r4, lr}                                              ldr     r3, .L6+4
  ldr r3, .L8                                                ldmia   r3!, {r1, r4, r5}
  ldr r4, .L8+4                                              stmia   r2!, {r1, r4, r5}
  ldm r3, {r0, r1, r2, r3}                                   ldr     r3, [r3]
  stm r4, {r0, r1, r2, r3}                                   str     r3, [r2]
  :::m                                                       :::m
  mov r2, #400                                               movs    r2, #200
  mov r0, r4                                                 ldr     r1, .L6+8
  ldr r1, .L8+8                                              lsls    r2, r2, #1
  bl memcpy                                                  bl      memcpy
  movs r0, #0                                                movs    r0, #0
  pop {r4, pc}                                               pop     {r4, r5, r6, pc}
.L8:                                                 .L6:
  .word b                                                    .word   a
  .word a                                                    .word   b
  .word c                                                    .word   c
  

https://godbolt.org/z/fh68cv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM