This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/37247] New: Function address passed as argument is incremented by 1
- From: "jlb dot for at free dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 26 Aug 2008 21:19:42 -0000
- Subject: [Bug c/37247] New: Function address passed as argument is incremented by 1
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
when calling a function with an function call address as argument, the address
is passed incremented by 1. it may work some times, but often crashes.
It can be verified in the dumpfile (.dm), the error is also present in hex
file.
the function call is "netif_add" (see below) argument "ethernetif_init" real
address is 0x0001261c, but in the table after the code (at 0x2050) we can find
0x0001261d. Of course, when calling the function, which then has an odd
address, the target generates a data error. Same problem with the last argument
"tcpip_input"
I have found same problems in other projects, I don't understand how they can
work.
Can it be a linker problem ? Why is the address incremented by 1? is there a
bad option in the makefile ? I think it can be a bug. not all function
addresses are affected.
project is based on lwip stack with freeRTOS. target : AT91SAM7X512 (or 256).
part extracted from .DM file:
===============================
00001f40 <vBasicWEBServer>:
1f40: b530 push {r4, r5, lr}
1f42: b091 sub sp, #68
1f44: ab03 add r3, sp, #12
.....
netif_add(&EMAC_if, &xIpAddr, &xNetMast, &xGateway, NULL, ethernetif_init,
tcpip_input);
....
1f7c: 46ec mov ip, sp
1f7e: 4b34 ldr r3, [pc, #208] (2050
<vBasicWEBServer+0x110>) <ethernetif_init>
1f80: 4660 mov r0, ip
1f82: 6043 str r3, [r0, #4]
1f84: 46ec mov ip, sp
1f86: 4b33 ldr r3, [pc, #204] (2054
<vBasicWEBServer+0x114>)<tcpip_input>
1f88: 4660 mov r0, ip
....
2038: 2296 movs r2, #150
203a: 1c23 adds r3, r4, #0
203c: f017 f9b4 bl 193a8 <xTaskCreate>
2040: e7c6 b.n 1fd0 <vBasicWEBServer+0x90>
2042: 46c0 nop (mov r8, r8)
2044: c0a8002d .word 0xc0a8002d
2048: c0a800fe .word 0xc0a800fe
204c: 0020ab68 .word 0x0020ab68
2050: 0001261d .word 0x0001261d <ethernetif_init>
2054: 0000f70d .word 0x0000f70d
2058: 00023ff8 .word 0x00023ff8
205c: 00001ebd .word 0x00001ebd
=======================
0001261c <ethernetif_init>:
1261c: b500 push {lr}
1261e: b083 sub sp, #12
12620: ab01 add r3, sp, #4
...
126a2: bc02 pop {r1}
126a4: 4708 bx r1
126a6: 46c0 nop (mov r8, r8)
126a8: 000124bd .word 0x000124bd
126ac: 000122a9 .word 0x000122a9
126b0: 00001388 .word 0x00001388
126b4: 000125f5 .word 0x000125f5
126b8: 4720 bx r4
126ba: 46c0 nop (mov r8, r8)
=======================
0000f70c <tcpip_input>:
* to an IP header (if netif doesn't got NETIF_FLAG_ETHARP flag)
* @param inp the network interface on which the packet was received
*/
err_t
tcpip_input(struct pbuf *p, struct netif *inp)
{
f70c: b500 push {lr}
f70e: b084 sub sp, #16
...
f7a2: b004 add sp, #16
f7a4: bc02 pop {r1}
f7a6: 4708 bx r1
f7a8: 0021570c .word 0x0021570c
makefile used:
========================
#
***************************************************************************
# See http://www.FreeRTOS.org for documentation, latest information,
license
# and contact details. Please ensure to read the configuration and
relevant
# port sections of the online documentation.
#
***************************************************************************
CC=arm-elf-gcc
AS=arm-elf-gcc -x assembler-with-cpp
OBJCOPY=arm-elf-objcopy
ARCH=arm-elf-ar
DEBUG=-g
OPTIM=-O0
LDSCRIPT=atmel-rom.ld
#jlb -S: intermix C with Assembler
ODFLAGS = -f -p -x -h -t -s -D -S -r -G -W
OBJDUMP = arm-elf-objdump
#Project and main binary file name
PROJECT = InterfaceIP_V1
#
# CFLAGS common to both the THUMB and ARM mode builds
#
#jlb : remove one level '../' before Source
CFLAGS= \
-I. \
-I./Include \
-I./EMAC \
-I../Common/include \
-I./USB \
-I./lwip-1.3.0/src/include \
-I./lwip-1.3.0/contrib/port/FreeRTOS/AT91SAM7X \
-I./lwip-1.3.0/contrib/port/FreeRTOS/AT91SAM7X\arch \
-I../Source/include \
-I../Source/portable/GCC/ARM7_AT91SAM7S \
-I./lwip-1.3.0/src/include/ipv4 \
-I./Txs_generic \
-I./Txs_custom \
-I./Txs_http \
-Wall \
-Wextra \
-Wstrict-prototypes \
-Wmissing-prototypes \
-Wmissing-declarations \
-Wno-strict-aliasing \
-D SAM7_GCC \
-D THUMB_INTERWORK \
-mthumb-interwork \
-mcpu=arm7tdmi \
-T$(LDSCRIPT) \
$(DEBUG) \
$(OPTIM) \
-fomit-frame-pointer
THUMB_FLAGS=-mthumb
LINKER_FLAGS=-Xlinker -o$(PROJECT).elf -Xlinker -M -Xlinker -Map=$(PROJECT).map
--cref
#jlb
# Define ASM defines here
# List all default ASM defines here, like -D_DEBUG=1
DADEFS =
#CHIP = at91sam7x256
CHIP = at91sam7x512
UADEFS = -D$(CHIP)
ADEFS = $(DADEFS) $(UADEFS) -D__ASSEMBLY__
ASFLAGS = -mcpu=arm7tdmi -g -gdwarf-2 -Wa,-amhls=$(<:.s=.lst) $(ADEFS)
-mthumb-interwork
#
# Source files that can be built to THUMB mode.
#
FREERTOS_THUMB_SRC= \
../Source/tasks.c \
../Source/queue.c \
../Source/list.c \
../Source/portable/GCC/ARM7_AT91SAM7S/port.c
DEMO_APP_THMUB_SRC= \
../Source/portable/MemMang/heap_2.c \
ParTest/ParTest.c \
Txs_custom/main.c \
Txs_generic/io.c \
../Common/Minimal/flash.c \
../Common/Minimal/BlockQ.c \
../Common/Minimal/PollQ.c \
../Common/Minimal/semtest.c \
TxsWEB.c \
USB/USB-CDC.c \
Txs_http/txs_httpd-fs.c \
Txs_http/http-strings.c
LWIP_THUMB_SRC= \
lwip-1.3.0/src/core/tcp_out.c \
lwip-1.3.0/src/core/ipv4/inet.c \
lwip-1.3.0/src/core/ipv4/inet_chksum.c \
lwip-1.3.0/src/core/mem.c \
lwip-1.3.0/src/core/memp.c \
lwip-1.3.0/src/core/netif.c \
lwip-1.3.0/src/core/init.c \
lwip-1.3.0/src/core/pbuf.c \
lwip-1.3.0/src/core/raw.c \
lwip-1.3.0/src/core/stats.c \
lwip-1.3.0/src/core/sys.c \
lwip-1.3.0/src/core/tcp.c \
lwip-1.3.0/src/core/tcp_in.c \
lwip-1.3.0/src/core/ipv4/ip.c \
lwip-1.3.0/src/core/ipv4/ip_addr.c \
lwip-1.3.0/src/core/ipv4/icmp.c \
lwip-1.3.0/src/netif/etharp.c \
lwip-1.3.0/src/api/tcpip.c \
lwip-1.3.0/src/api/netbuf.c \
lwip-1.3.0/src/api/api_msg.c \
lwip-1.3.0/src/api/err.c \
lwip-1.3.0/src/api/api_lib.c \
lwip-1.3.0/contrib/port/FreeRTOS/AT91SAM7X/sys_arch.c \
lwip-1.3.0/src/netif/ethernetif.c \
EMAC/SAM7_EMAC.c \
lwip-1.3.0/src/core/udp.c \
lwip-1.3.0/src/core/ipv4/ip_frag.c \
lwip-1.3.0/src/core/dhcp.c \
lwip-1.3.0/src/api/sockets.c
# List ASM source files here (jlb)
ASRC = boot.s
#
# Source files that must be built to ARM mode.
#
ARM_SRC= \
../Source/portable/GCC/ARM7_AT91SAM7S/portISR.c \
EMAC/SAM7_EMAC_ISR.c \
USB/USBIsr.c \
Cstartup_SAM7.c
#
# Define all object files.
#
ARM_OBJ = $(ARM_SRC:.c=.o)
FREERTOS_THUMB_OBJ = $(FREERTOS_THUMB_SRC:.c=.o)
DEMO_APP_THMUB_OBJ = $(DEMO_APP_THMUB_SRC:.c=.o)
LWIP_THUMB_OBJ = $(LWIP_THUMB_SRC:.c=.o)
BOOT_OBJ = $(ASRC:.s=.o)
#jlb
all: $(PROJECT).hex $(PROJECT).bin $(PROJECT).elf
$(PROJECT).bin : $(PROJECT).elf
$(OBJCOPY) $(PROJECT).elf -O binary $(PROJECT).bin
$(PROJECT).hex : $(PROJECT).elf
$(OBJCOPY) $(PROJECT).elf -O ihex $(PROJECT).hex
#jlb
$(OBJDUMP) $(ODFLAGS) $(PROJECT).elf > $(PROJECT).dm
$(PROJECT).elf : $(BOOT_OBJ) $(ARM_OBJ) $(DEMO_APP_THMUB_OBJ) $(LWIP_THUMB_OBJ)
$(FREERTOS_THUMB_OBJ) Makefile FreeRTOSConfig.h
$(CC) $(CFLAGS) $(BOOT_OBJ) $(ARM_OBJ) $(DEMO_APP_THMUB_OBJ)
$(LWIP_THUMB_OBJ) $(FREERTOS_THUMB_OBJ) -nostartfiles $(LINKER_FLAGS)
$(DEMO_APP_THMUB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
$(LWIP_THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
$(FREERTOS_THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
$(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
$(CC) -c $(CFLAGS) $< -o $@
$(BOOT_OBJ) : %.o : %.s $(LDSCRIPT) Makefile FreeRTOSConfig.h
$(AS) -c $(ASFLAGS) $< -o $@
clean:
touch Makefile
#jlb
rm -f $(PROJECT).elf
rm -f $(PROJECT).hex
rm -f $(PROJECT).bin
rm -f $(PROJECT).dm
#----------------------------
# added by JLB
#----------------------------
# specify output filename here (must be *.bin file)
TARGET = $(PROJECT).bin
# specify the directory where openocd executable resides (openocd-ftd2xx.exe or
openocd-pp.exe)
#OPENOCD_DIR = C:\Program Files\amontec\sdk4arm\ocd\openocd\bin
OPENOCD_DIR = C:\Program Files\openocd-r717\bin
# specify OpenOCD executable (pp is for the wiggler, ftd2xx is for the USB
debugger)
#OPENOCD = '$(OPENOCD_DIR)\openocd.exe'
OPENOCD = '$(OPENOCD_DIR)\openocd-ftd2xx.exe'
# specify OpenOCD configuration file (pick the one for your device)
OPENOCD_CFG = 'jtagkey-at91r40008-progflash.cfg'
# specify the name and folder of the flash programming script file
#OPENOCD_SCRIPT = Flashprog.ocd
# program the AT91SAM7S256 internal flash memory
#*****************
# Flashprog
#*****************
Flashprog: $(TARGET)
@echo "Flash Programming with OpenOCD..."
$(OPENOCD) -f $(OPENOCD_CFG)
@echo "Flash Programming Finished."
--
Summary: Function address passed as argument is incremented by 1
Product: gcc
Version: 4.2.2
Status: UNCONFIRMED
Severity: blocker
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jlb dot for at free dot fr
GCC build triplet: 4.2.2
GCC host triplet: PC x86 windows XP
GCC target triplet: arm7
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37247