[英]GCC is not finding the built-in 'memcpy'
我正在使用 GCC 的arm-none-eabi版本在 ARM Cortex-M微控制器上工作。 我也在使用-fnostdlib
和-fnostdin
。
在我的代碼中,我使用memcpy
和strlen
。 根據 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.