Folgendes Problem:
Es gibt ja so manchen Cross-Compiler, bei dem Entwickler von Programmen, die damit kompiliert wurden, auf make- und ninja-Skripte setzen.
Will man das Programm oder ein anderen Programm selber kompilieren, dann funktioniert jedoch leider gar nichts, weil man die ganzen Compiler- und Linker-Optionen nicht richtig gesetzt hat.
Daher habe ich nun kleine Hilfsprogramme geschrieben, die leider nicht alle funktionieren (und ich weiß nicht warum).
Als Hilfsprogramm ist hier erst einmal hallo.c genannt, das auf Linux zu “hallo” kompiliert wird.
#include <stdio.h>
int main() {
printf("Hallo zusammen!\n");
return 0;
}
Um mir die Übergabe auf der Kommandozeile anzusehen, habe ich folgendes kleines Programm printit.c
#include <stdio.h>
int main(int argc, char *argv[]) {
int i=0;
printf("\n[->] %s", argv[0]);
for (i=1; i<argc; i++) {
printf(" %s", argv**);
}
printf("\n");
return 0;
}
Ein Test mit der Eingabe von
$ ./printit.orig egreg wgrgh wrgh
gibt auch
[->] ./printit egreg wgrgh wrgh
aus.
So weit so gut.
Das heißt, wenn ich den gcc durch das Programm ersetze, dann werden mir die Kommandozeileoptionen zurückgegeben, die während des Kompilierens übergeben wurden.
Nun will ich jedoch nicht einfach nur die Compiler durch solche Binaries ersetzen, denn der Compiler soll auch gleichzeitig seine Aufgabe erfüllen.
Daher möchte ich, daß das eigentliche Programm ebenfalls aufgerufen wird.
Hier mein Programm printit4.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
char *string = argv[0];
int ret;
int i=0;
printf("\n\n[->] %s", argv[0]);
for (i=1; i<argc; i++) {
printf(" %s", argv**);
}
printf("\n\n");
strncat(string, ".orig",5);
execvp(string, argv);
return -1;
}
Der erste Test ist nun das Binary “hallo” in “hallo.org” umzubenennen und “printit4” zu “hallo” zu kopieren.
Ausführen von “hallo” liefert dann
./hallo
[->] ./hallo
Hallo zusammen!
Wuderbar. Nun benenne ich “printit” in “printit.org” um und “printit4” kopiere ich zu “printit”.
Aufruf von “printit” mit Argumenten:
./printit dew wegewg 4 646 jm rtg4 4t4
[->] ./printit dew wegewg 4 646 jm rtg4 4t4
[->] ./printit.orig orig 4 646 jm rtg4 4t4
Man sieht, daß an das ursprüngliche “printit4”-Programm alles richtig übergeben wurde. Nur hat dieses Programm dann die Argumente nicht richtig an das Original “printit” übergeben. Warum?
Grüße
theuserbl