I'm trying to compile a small program for arm7tdmi
(i.e. armv4t
), using the command arm-linux-gnueabi-gcc -march=armv4t -mcpu=arm7tdmi -nostartfiles -static test.c -o test
on Debian (gcc version 10.2.1, Debian 10.2.1-6). However, GCC seems to ignore the cpu and arch flags, and generates instructions that are unsupported on armv4t
, e.g. clz
, as shown by objdump
:
104f4: 0a000071 beq 106c0 <.divsi3_skip_div0_test+0x1f0>
104f8: e16f2f13 clz r2, r3
104fc: e16f0f11 clz r0, r1
10500: e0402002 sub r2, r0, r2
10504: e272201f rsbs r2, r2, #31
I also checked the binary using readelf
, and it shows the architecture is actually armv5te
:
File Attributes
Tag_CPU_name: "5TE"
Tag_CPU_arch: v5TE
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
May I ask what's going on here? Why is GCC ignoring the -mcpu
and -march
flags?
Here's the content of test.c
:
#include <stdint.h>
#include <stddef.h>
void _start() {
const size_t len = 8;
uint8_t arr[8] = {10, 12, 8, 5, 0, 2, 3, 55};
uint8_t *data = arr;
uint16_t a = 1, b = 0, m = 7;
for(int i=0; i<len; i++) {
a = (a + data[i]) % m;
b = (a + b) % m;
}
uint32_t res = (uint32_t)b << 16 | (uint32_t)a;
}