Hi ROM,<br>     When I am trying to use libpayload in my own usbrom, i find that I the function point seems wrong. In my main.c files:<br>     int main(int argc, char **argv){<br>     <br>    const char *s="foo";<br>
    console_init();<br><br> <span style="color: rgb(255, 0, 0);">   puts(s);</span>//the address of s which should passed to puts was wrong <br>//// I check it with HDT find it move address 262c to[esp].  <br><br>    while(1);<br>
    return 0;<br>}<br>I really do not know why, and my ldscript is<br><br><br>OUTPUT_FORMAT("elf32-i386")<br>OUTPUT_ARCH(i386)<br>ENTRY(_setup)<br>/* 32KB heap and 16KB stack */<br>HEAP_SIZE = 32768;<br>STACK_SIZE = 16384;<br>
<br>__boot_vect = 0x0000;<br><br>SECTIONS<br>{<br><br>    .text __boot_vect :  <br>    {<br>      *( .text)    <br>    } = 0x00<br><br>    .rodata ALIGN(4) : <br>    {<br>      *( .rodata)<br>    } = 0x00<br><br>    .data ALIGN(4) : <br>
    {<br>      *( .data)<br>    } = 0x00<br><br>    .bss ALIGN(4) : <br>    {<br>      *( .bss)<br>    /* heap and stack */<br><br>    . = ALIGN(16);<br>    _heap = .;<br>    . += HEAP_SIZE;<br>    . = ALIGN(16);<br>    _eheap = .;<br>
<br>    _stack = .;<br>    . += STACK_SIZE;<br>    . = ALIGN(16);<br>    _estack = .;<br>    } = 0x00<br><br>}<br>and Makefile is <br>export obj := $(shell pwd)/build<br>export src := $(shell pwd)/src<br>export build := $(shell pwd)/build<br>
<br>ifeq ($(V),1)<br>Q := @<br>endif<br><br>TARGETS-y := head.o main.o<br>OBJS      := $(patsubst %,$(obj)/%,$(TARGETS-y))<br><br>ROM_OBJ= $(obj)/usb.rom<br>ROM_BIN= $(obj)/usb.bin<br>ROM_SIZE= 65536<br><br>OBJCOPY= objcopy<br>
OBJCOPY_FLAGS= -O binary<br>BUILD_ROM= ./build_rom<br><br>LIBPAYLOAD_PREFIX= /opt/libpayload<br>LIBPAYLOAD=$(LIBPAYLOAD_PREFIX)/lib/libpayload.a<br>INCPAYLOAD=$(LIBPAYLOAD_PREFIX)/include/<br><br>STACKPROTECT += $(call cc-option, -fno-stack-protector,)<br>
GCCINCDIR = $(shell $(CC) -print-search-dirs | head -n 1 | cut -d' ' -f2)include/<br><br>INCLUDES := -I$(INCPAYLOAD) -Iinclude -Ibuild<br>INCLUDES += -Iinclude -Ibuild<br>INCLUDES += -I$(GCCINCDIR) -I$(INCPAYLOAD)/i386/<br>
<br>CFLAGS += -Wall $(STACKPROTECT) $(INCLUDES) -c -fno-builtin -nostdinc -Werror -Os -fomit-frame-pointer -fno-common -ffreestanding -fno-strict-aliasing<br>CFLAGS= $(STACKPROTECT) $(INCLUDES) -c -fno-builtin -nostdinc -O2 -I. -Wall -Werror<br>
<br>LIBGCC = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)<br><br>all:$(ROM_BIN)<br><br>$(ROM_BIN): $(OBJS)<br>    $(Q)printf "  LD      $(subst $(shell pwd)/,,$(@))\n"<br>    $(Q)$(LD) -T $(src)/ldscript -static -o $@ $(OBJS) $(LIBPAYLOAD) $(LIBGCC)<br>
    $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) $(ROM_BIN) $(ROM_OBJ)<br>    $(Q)$(BUILD_ROM) $(ROM_OBJ) $(ROM_SIZE)<br><br>$(obj)/%.o: $(src)/%.c<br>    $(Q)printf "  CC      $(subst $(shell pwd)/,,$(@))\n"<br>    $(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<<br>
<br>$(obj)/%.o: $(src)/%.S<br>    $(Q)printf "  AS      $(subst $(shell pwd)/,,$(@))\n"<br>    $(Q)$(AS) -o $@ $<<br><br>prepare:<br>    $(Q)printf "  SH      building/preparing libpayload\n"<br>    $(Q)./prepare.sh<br>
<br>clean:<br>    $(Q)printf "  SH      cleaning $(obj)\n"<br>    $(Q)rm -f $(obj)/*.o $(obj)/*.rom $(obj)/*.bin<br><br>distclean: clean<br>    $(Q)printf "  SH      cleaning $(src)\n"<br>    @rm -Rf build<br>
    @rm -Rf libpayload<br>i also attached all of my source file. Could you please help me to take a look at this? Thanks.<br clear="all"><br>-- <br>Jason Wang <br>Peking University<br>