Hi ROM,
     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:
     int main(int argc, char **argv){
     
    const char *s="foo";
    console_init();

    puts(s);//the address of s which should passed to puts was wrong
//// I check it with HDT find it move address 262c to[esp]. 

    while(1);
    return 0;
}
I really do not know why, and my ldscript is


OUTPUT_FORMAT("elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_setup)
/* 32KB heap and 16KB stack */
HEAP_SIZE = 32768;
STACK_SIZE = 16384;

__boot_vect = 0x0000;

SECTIONS
{

    .text __boot_vect : 
    {
      *( .text)   
    } = 0x00

    .rodata ALIGN(4) :
    {
      *( .rodata)
    } = 0x00

    .data ALIGN(4) :
    {
      *( .data)
    } = 0x00

    .bss ALIGN(4) :
    {
      *( .bss)
    /* heap and stack */

    . = ALIGN(16);
    _heap = .;
    . += HEAP_SIZE;
    . = ALIGN(16);
    _eheap = .;

    _stack = .;
    . += STACK_SIZE;
    . = ALIGN(16);
    _estack = .;
    } = 0x00

}
and Makefile is
export obj := $(shell pwd)/build
export src := $(shell pwd)/src
export build := $(shell pwd)/build

ifeq ($(V),1)
Q := @
endif

TARGETS-y := head.o main.o
OBJS      := $(patsubst %,$(obj)/%,$(TARGETS-y))

ROM_OBJ= $(obj)/usb.rom
ROM_BIN= $(obj)/usb.bin
ROM_SIZE= 65536

OBJCOPY= objcopy
OBJCOPY_FLAGS= -O binary
BUILD_ROM= ./build_rom

LIBPAYLOAD_PREFIX= /opt/libpayload
LIBPAYLOAD=$(LIBPAYLOAD_PREFIX)/lib/libpayload.a
INCPAYLOAD=$(LIBPAYLOAD_PREFIX)/include/

STACKPROTECT += $(call cc-option, -fno-stack-protector,)
GCCINCDIR = $(shell $(CC) -print-search-dirs | head -n 1 | cut -d' ' -f2)include/

INCLUDES := -I$(INCPAYLOAD) -Iinclude -Ibuild
INCLUDES += -Iinclude -Ibuild
INCLUDES += -I$(GCCINCDIR) -I$(INCPAYLOAD)/i386/

CFLAGS += -Wall $(STACKPROTECT) $(INCLUDES) -c -fno-builtin -nostdinc -Werror -Os -fomit-frame-pointer -fno-common -ffreestanding -fno-strict-aliasing
CFLAGS= $(STACKPROTECT) $(INCLUDES) -c -fno-builtin -nostdinc -O2 -I. -Wall -Werror

LIBGCC = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)

all:$(ROM_BIN)

$(ROM_BIN): $(OBJS)
    $(Q)printf "  LD      $(subst $(shell pwd)/,,$(@))\n"
    $(Q)$(LD) -T $(src)/ldscript -static -o $@ $(OBJS) $(LIBPAYLOAD) $(LIBGCC)
    $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) $(ROM_BIN) $(ROM_OBJ)
    $(Q)$(BUILD_ROM) $(ROM_OBJ) $(ROM_SIZE)

$(obj)/%.o: $(src)/%.c
    $(Q)printf "  CC      $(subst $(shell pwd)/,,$(@))\n"
    $(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

$(obj)/%.o: $(src)/%.S
    $(Q)printf "  AS      $(subst $(shell pwd)/,,$(@))\n"
    $(Q)$(AS) -o $@ $<

prepare:
    $(Q)printf "  SH      building/preparing libpayload\n"
    $(Q)./prepare.sh

clean:
    $(Q)printf "  SH      cleaning $(obj)\n"
    $(Q)rm -f $(obj)/*.o $(obj)/*.rom $(obj)/*.bin

distclean: clean
    $(Q)printf "  SH      cleaning $(src)\n"
    @rm -Rf build
    @rm -Rf libpayload
i also attached all of my source file. Could you please help me to take a look at this? Thanks.

--
Jason Wang
Peking University