Rahul Vyas
Rahul Vyas

Reputation: 28750

GDB error invalid offset, value too big (0x00000400) Unable to build app in debug mode need help

I have an app which was working fine few days ago. But today I'm getting this error:

{standard input}:1948:invalid offset, value too big (0x00000400) Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit >code 1

Upvotes: 3

Views: 3337

Answers (4)

Matthias Urlichs
Matthias Urlichs

Reputation: 2544

While this question is not strictly about assembler, this question pops up in web searches about this specific errors often enough that I'd like to add an answer that should be helpful to people programming in it.

The assembler syntax is LDR REG, =SOMETHING.

If that SOMETHING is >16 bits, we got a problem because Thumb doesn't have 32-bit immediates. To fix this, the assembler remembers the constant and replaces the statement with a PC-relative load to something that's less than 0x400 bytes off (more than that doesn't fit in the instruction).

You then say

.ltoff

someplace convenient (e.g. right behind the next bx lr or pop {pc}) to direct the assembler to place these constants there.

Upvotes: 0

Adrian
Adrian

Reputation: 11

I had a similar issue today while I was writing an assembly routine for an ARM Cortex-M0 processor. In my case, the code that caused the error looked like this:

ldr r7 ,=PRTCNFG_10

This is a pseudo instruction causing the processor to load the value of constant PRTCNFG_10 (defined using the .equ directive) into register r7. The pseudo instruction will be translated into

ldr r7 ,[pc, #immed8]

where #immed8 is an 8 bit immediate value. Since 2^8=256, the definition of PRTCNFG_10 must not be placed beyond pc+256 bytes, otherwise the Assembler will throw an error.

I solved the issue by explicitly allocating PRTCNFG_10 in memory:

PRTCNFG_10:
.word 0x606

Upvotes: 1

theevank
theevank

Reputation: 71

Just saw the same issue, which also turned out to be caused by a switch case. It wasn't even that big (26 cases), and it had compiled fine in the past, but for some reason it started to fail today. Replacing it with if-else solved the weird GCC error.

Upvotes: 0

Rahul Vyas
Rahul Vyas

Reputation: 28750

Ok Guys, After a lot of troubleshooting finally I found the solution. A big Switch Case was the problem. Converting that into if else statement solved the problem.

Upvotes: 2

Related Questions