KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: .elf erstellen/verwenden
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Moin moin,
Ich hab mich eben durch diverse Tuts zum pspsdk gelesen.
So, das Kompilieren des Samples macht auch keine Probleme.
Wenn ich jedoch bspw. einen einfachen "Hello World" Code kompilieren will, erscheint nur dieser Fehler:
"make: *** No rule to make target `main.o', needed by `*targetname*.elf'. Stop."
*targetname* entspricht der Zeile in der makefile:
TARGET = *targetname*

Wie erstelle ich nun diese .elf oder brauch die am Ende vllt garnicht?

MfG. mipez

*EDIT*
Nur um mal den Source zu stellen:
main.h

Code:
#include <pspkernel.h>
#include <pspdebug.h>

PSP_MODULE_INFO("Hello World",0,1,1);

#define printf pspDebugScreenPrintf

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;

          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);

          sceKernelSleepThreadCB();

          return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
          int thid = 0;

          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }

          return thid;
}

int main() {
pspDebugScreenInit();
SetupCallbacks();

printf("Hello World");

sceKernelSleepThread();

return 0;
}


makefile

Code:
TARGET = hello
OBJS = main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Hello World

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Ich sehe den Source Code nicht!
Die .elf ist nur für den Compiler, eine Art zwischenstation.
Was für eine Dev-Umgebung nutzt du?

EDIT: hat sich erledigt

D3lta :
Ich sehe den Source Code nicht!
Die .elf ist nur für den Compiler, eine Art zwischenstation.
Was für eine Dev-Umgebung nutzt du?

EDIT: hat sich erledigt


Steht der EDIT zur letzten Frage?
Wenn nicht... ich nutze die Standartumgebung der pspsdk-Toolchain.

Sry wenn ich doof frage, für Win oder Lin(oder cygwin, is ja euch Lin)?
mfg D3lta
Win, 64bit falls es wichtig is.
Probiere es dann einmal mit meiner Basis-Makefile:

Code:
TARGET = Name
OBJS = main.o

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
PSP_FW_VERSION=550

LIBDIR =
LDFLAGS =

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Name_der_EBOOT

PSP_EBOOT_ICON =
PSP_EBOOT_PIC1 =
PSP_EBOOT_SND0 =

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak


mfg D3lta

Nope, klappt auch nicht. Selbiger Fehler wie vorher.
main.c, nicht main.h :/

BTW, die ELF ist keine Zwischenstation für den Compiler, die ELF ist die eigentliche ausführbare Datei (das Format kommt von Unix, und wird gerne von Sony verwendet).
Diese wird in die PBP eingebettet, das Offset in der PBP wird im Header (Bytes 32 bis 35) gespeichert.
Es gibt 2 Arten von ELFs:
- Statische ELFs (diese benutzten feste Speicheradresse, und müsst deshalb immer von der selben Position im RAM geladen werden).
- Relocateable ELFs (aka PRXs, wenn die Relocation Symbole aufgelöst sind, können diese von jeder beliebigen Speicheradresse geladen werden).

mfg, HacKmaN
nenne mal die main.h in main.c um.
mfg D3lta
Erledigt, aber warum wird das dennoch gespeichert obwohl ich auf abbrechen gegangen bin -.-
Alles klar, das Umbennen von .h zu .c hat geklappt.

Vielen Dank an alle.

HacKmaN :
main.c, nicht main.h :/
Es gibt 2 Arten von ELFs:
- Statische ELFs (diese benutzten feste Speicheradresse, und müsst deshalb immer von der selben Position im RAM geladen werden).
- Relocateable ELFs (aka PRXs, wenn die Relocation Symbole aufgelöst sind, können diese von jeder beliebigen Speicheradresse geladen werden).

mfg, HacKmaN


Nun ja, soweit ich weiß, gibt es mindestens 3 verschiedene ELF Typen:

Typ 1: relocatable ELF - hält wichtigen code, der als Anleitung zum linken mit anderen Objekt Dateien verwendet wird, um eine ausfürbare oder shared Datei zu erzeugen

Typ 2: executable ELF - legt fest, wie ein ausfürbares Program gestartet werden soll (über den ELF struct member "exec")

Typ 3: shared object ELF - enthält code für das linken in zwei unterschiedlichen Kontexten. Der "link editor" (1. Kontext) kann die Datei entweder mit einem relocatablen file oder einem andere shared object file linken, um eine neues object file zu erstellen. Der "dynamische linker" wiederum kann die Datei mit einem executablen file linken oder aber mit einem anderen shared object file, um ein Prozess Abbild zu erzeugen.

Wenn wir uns jetzt sogar die Definiton des ELF header members "e_type" anschauen, stellen wir fest:

Code:
Name_ _______Value_ _______________Meaning_____
ET_NONE          0                    No file type
ET_REL           1                    Relocatable file
ET_EXEC          2                    Executable file
ET_DYN           3                    Shared object file
ET_CORE          4                    Core file
ET_LOPROC       0xff00               Processor-specific
ET_HIPROC       0xffff               Processor-specific _

_______________________________________

Es gibt noch 3 weitere mögliche ELF types, wobei die von mir und HacKmaN dargestellten Typen die wichtigsten sind.

Der Inhalt von "Core file" ist zum Beispiel unbestimmt, während "ET_LOPRPC" und "ET_HIPROC" für Prozessor spezifische Semantiks reserviert sind.

Von einer Shared ELF hab ich ehrlicherweiße noch nie was gehört Wink
Ich hab bis jetzt eigentlich nur mit Statischen (e_type == 2) und Relocate ELFs (e_type == 1) zu tun gehabt, von den anderen hab ich bis jetzt nichts gewusst Smile

Danke für den Hinweiß, ich werds mir merken Smile
Ich kann dir, wenn du willst, eines der ELF-Dokumente geben, die ich verwende.

PSP_Lord :
Ich kann dir, wenn du willst, eines der ELF-Dokumente geben, die ich verwende.


Schick mir mal bitte nen Link, das würd mich interessieren Smile

Referenz-URLs