Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » libs von bin heruasfinde

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.07.2006, 16:15 Uhr
central



Guten Tag ,
Mein Anliegen ist ein eine initrd zu erstellen.
Wenn ich nun die '/bin/sh' zu meiner initrd kopiere brauch ich natürlich auch die librarys von denn sie abhängt.
was ldd ja auch shön zeigt.

Code:
ldd /bin/sh
libncurses.so.5 => /usr/lib64/libncurses.so.5 (0x00002b6b8322b000)
        libdl.so.2 => /lib/libdl.so.2 (0x00002b6b83387000)
        libc.so.6 => /lib/libc.so.6 (0x00002b6b8348b000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b6b83113000)  


Davon brauche ich nur den Pfad inkl library um sie dann in meine initrd zu kopieren.

Ich hatte es erst mit mit execl versucht .
Das sah dann so aus

Code:
std::string meinbefehl = "/usr/sbin/ldd  /bin/sh >> tempfile";
execl( execl("/bin/sh", "sh","-c", meinbefehl.c_str() ,NULL);


klappte natürlich nicht da cat nicht gefunden wird

Nun meine Frage gibt es eine Funktion die mir Abhängkeiten anzeigen kann ?

Oder wie könnte ich das sonst bewerkstelligen ?



Ich habe meine Frage auch schon bei mrunix gestellt nur leider keine zufrieden stellende
Antword bekommen, also frage ich hier mal nach
In guter hoffnung

gruß

central
--
no trouble no fun

Dieser Post wurde am 06.07.2006 um 16:55 Uhr von central editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.07.2006, 16:37 Uhr
Pablo
Supertux
(Operator)


Ich verstehe nicht, was die initrd Umgebung mit execl zu tun hat, bzw. was du mit execl machen willst. Wäre nicht ein cp Befehl einfacher, um die Sachen zu kopieren?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2006, 16:52 Uhr
central



Ok dann versuche ich das mal genauer zu erklären,
mit execl wollte ich ldd ausführen und mir die abhängigkieten in eine datei umleiten.
um sie dann auszulesen und die libs zu kopieren.

Ich brauche die Abhängikeiten von zum beispiel

Code:
/bin/sh  



Die Abhängigkeiten würde mir ja in der shell ldd anzeigen .
Nun brauche in eine Funktion die genau das macht, mir die
Abhängikeiten einer binary anzeigt .
wenn ich dann die abhängikeiten habe also weiß welche benötigt werden ,
dann erst kann ich sie kopieren.

gruß

central
--
no trouble no fun

Dieser Post wurde am 06.07.2006 um 16:58 Uhr von central editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.07.2006, 19:37 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Geh mit "find" durch Deine ausführbaren Dateien, ruf für jede "ldd" auf und leite die gesamte Ausgabe durch "sort" und "uniq" in eine Datei...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.07.2006, 19:38 Uhr
Pablo
Supertux
(Operator)


Ich hab schon verstanden, wozu du die lib Abhängigkeiten willst (ich habe selber initrd Datein für eigene erstellte LiveCDs erstellen müssen). Was ich nicht verstehe, was hat das mit C/C++ zu tun? Willst du ein Programm schreiben, das dir die Abhängigkeiten mehrerer Dateien auf einmal anzeigt? Wäre ein bash skript nicht besser? Hier ein Tip: führe folgendes aus:

ldd /bin/cat | sed -e 's/.*=>\(.*\)/\1/g' -e 's/^\(.*\)(.*)\(.*\)$/\1/g'

Dann könntest du sowas machen wie


bash:

#!/bin/bash

INITRD_PATH=/....

for i in ${INITRD_PATH}/bin/* ; do
  cp -a -v `ldd ${INITRD_PATH}/bin/${i} | sed -e 's/.*=>\(.*\)/\1/g' \
    -e 's/^\(.*\)(.*)\(.*\)$/\1/g'` ${INITRD_PATH}/lib
done


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.07.2006 um 19:41 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.07.2006, 20:02 Uhr
central



Guten Nabend,
Also wie ich das per skript lösen kann war mir vorher auch schon klar, denke das kann ich besser als c/c++ und genau das ist der Grund warum ich das per c/c++ lösen möchte nämlich um c++ besser zu verstehen .
@Bruder Leif
das Problem ist das 'ldd' wenn ich es per fork und execl aufrufe abbbricht da cat nicht gefunden
wurde ein beispiel

Code:
#define CHILD_FORK_PID           0
int  pid = fork();
std::string derpfa = "/bin/sh";
        if ( pid == CHILD_FORK_PID )
        {
        execl("/usr/bin/ldd", "ldd ",derpfa.c_str(),NULL);
                  perror( "" );
            exit( EXIT_FAILURE );
         }


das läuft so ähnlich in einer schleife in der sich derpfa natürlich jedesmal ändert.
die ausgabe lautet

Code:
/bin/sh
/usr/bin/ldd: line 117: cat: command not found



was tun sprach zeus

gruß

central
--
no trouble no fun
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.07.2006, 20:11 Uhr
Pablo
Supertux
(Operator)


was hat cat denn damit zu tun? Geht es ldd, wenn du einfach so über die Konsole aufrufst?

Außerdem hab ich dir ein fertiges Skript gepostet, brauchst nur copy&paset, wozu C++ nehmen?

Nachtrag: Das Problem ist, dass die Environment Vars nicht richtig gesetzt werden, so dass PATH wahrscheinlich leer ist und cat nicht gefunden wird. Du könntest /usr/bin/ldd editieren, so dass du cat in /usr/bin/cat änderst
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.07.2006 um 20:15 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.07.2006, 21:31 Uhr
central



hmm,
das ist ja schon mal Ansatz aber auch nicht wirklich eine Lösung, da mein Programm nicht mehr portabel wäre also unter linux (winkompatibel ja sowieso nicht ) ich kann ja nicht einfach auf jedem Rechner "cat" zu meine programm kompatibel machen
Ich könnte dann auch genausogut die Abhängikeiten statisch machen , würde dann warscheinlich auch nur auf meinem Rechner laufen hmm.

Ziel ist es das mein Programm auf amd64 und i386 läuft, auch noch in zwei Monaten was bei statischen libaries wohl nicht zu machen ist .

aus man exec

Zitat:

Die Funktion execle übergibt zusätzlich die Umgebungsvariablen (siehe
env(1)) in einem Zeigervektor an das Folgeprogramm.



na da werde ich mal schauen

wenn jemand noch eine lösung hat nur raus damit.

gruß

central
--
no trouble no fun
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.07.2006, 21:57 Uhr
Pablo
Supertux
(Operator)


jetzt verstehe ich nur Bahnhof. Was soll denn dein tolles Programm denn tun? Und was hat das mit der initrd Datei zu tun?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.07.2006, 22:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, execlp sollte das cat problem lösen, ansonsten kannst du höchstens um den pipe zu machen folgendes ausführen:

/bin/sh -c ldd programm >> tempfile

nur ist das imho schwachsinn.

leite doch einfach nachm fork vor dem execl(p) stdout nach tempfile um, execl "erbt" ja imho die std-filedeskriptoren.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: