What about this slightly simpler Makefilery? I'll test ARM shortly, help with PPC will be gladly accepted. :) Paolo diff --git a/arm/Makefile.common b/arm/Makefile.common index a786fcf..be99a4a 100644 --- a/arm/Makefile.common +++ b/arm/Makefile.common @@ -54,7 +54,7 @@ FLATLIBS = $(libcflat) $(LIBFDT_archive) $(libgcc) $(libeabi) %.elf: %.o $(FLATLIBS) arm/flat.lds $(cstart.o) $(CC) $(LDFLAGS) -o $@ \ -Wl,-T,arm/flat.lds,--build-id=none,-Ttext=$(start_addr) \ - $(filter %.o, $^) $(FLATLIBS) + $(filter %.o, $^) $(FLATLIBS) lib/auxinfo.c -DPROGNAME=\"$(*F)\" %.flat: %.elf $(OBJCOPY) -O binary $^ $@ diff --git a/lib/argv.c b/lib/argv.c index 4f6b4f0..f61992c 100644 --- a/lib/argv.c +++ b/lib/argv.c @@ -1,10 +1,13 @@ #include "libcflat.h" +#include "auxinfo.h" int __argc; char *__argv[100]; char *__args; char __args_copy[1000]; +static char *copy_ptr = __args_copy; + static bool isblank(char p) { return p == ' ' || p == '\t'; @@ -21,13 +24,12 @@ void __setup_args(void) { char *args = __args; char **argv = __argv; - char *p = __args_copy; while (*(args = skip_blanks(args)) != '\0') { - *argv++ = p; + *argv++ = copy_ptr; while (*args != '\0' && !isblank(*args)) - *p++ = *args++; - *p++ = '\0'; + *copy_ptr++ = *args++; + *copy_ptr++ = '\0'; } __argc = argv - __argv; } @@ -52,6 +54,8 @@ void setup_args_prognam(char *args) for (i = __argc; i > 0; --i) __argv[i] = __argv[i-1]; } - __argv[0] = NULL; // just reserve for now + __argv[0] = copy_ptr; + strcpy(__argv[0], auxinfo.prognam); + copy_ptr += strlen(auxinfo.prognam) + 1; ++__argc; } diff --git a/lib/auxinfo.c b/lib/auxinfo.c new file mode 100644 index 0000000..bffeac2 --- /dev/null +++ b/lib/auxinfo.c @@ -0,0 +1,2 @@ +#include "auxinfo.h" +struct auxinfo auxinfo = { PROGNAME }; diff --git a/lib/auxinfo.h b/lib/auxinfo.h new file mode 100644 index 0000000..18510ba --- /dev/null +++ b/lib/auxinfo.h @@ -0,0 +1,9 @@ +#ifndef _AUXINFO_H_ +#define _AUXINFO_H_ +struct auxinfo { + const char *prognam; +}; + +/* No extern! Define a common symbol. */ +struct auxinfo auxinfo; +#endif diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common index 4ff1dc8..bbad9c7 100644 --- a/powerpc/Makefile.common +++ b/powerpc/Makefile.common @@ -41,9 +41,10 @@ FLATLIBS = $(libcflat) $(LIBFDT_archive) %.elf: CFLAGS += $(arch_CFLAGS) %.elf: LDFLAGS = $(arch_LDFLAGS) -nostdlib -pie %.elf: %.o $(FLATLIBS) powerpc/flat.lds $(cstart.o) $(reloc.o) - $(LD) $(LDFLAGS) -o $@ \ - -T powerpc/flat.lds --build-id=none \ - $(filter %.o, $^) $(FLATLIBS) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ \ + -Wl,-T,powerpc/flat.lds -Wl,--build-id=none \ + $(filter %.o, $^) $(FLATLIBS) \ + lib/auxinfo.c -DPROGNAME=\"$*\" @echo -n Checking $@ for unsupported reloc types... @if $(OBJDUMP) -R $@ | grep R_ | grep -v R_PPC64_RELATIVE; then \ false; \ diff --git a/x86/Makefile.common b/x86/Makefile.common index 356d879..67fb65b 100644 --- a/x86/Makefile.common +++ b/x86/Makefile.common @@ -31,7 +31,7 @@ libgcc := $(shell $(CC) -m$(bits) --print-libgcc-file-name) FLATLIBS = lib/libcflat.a $(libgcc) %.elf: %.o $(FLATLIBS) x86/flat.lds $(cstart.o) $(CC) $(CFLAGS) -nostdlib -o $@ -Wl,-T,x86/flat.lds \ - $(filter %.o, $^) $(FLATLIBS) + $(filter %.o, $^) $(FLATLIBS) lib/auxinfo.c -DPROGNAME=\"$(*F)\" %.flat: %.elf $(OBJCOPY) -O elf32-i386 $^ $@ -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html