Seite 1 von 2

Pfad der Binary

Verfasst: 10.04.2006 22:19
von vonTurnundTaxis
Wie kann man (unter Linux) den Pfad seiner Binary ermitteln?

Verfasst: 10.04.2006 22:36
von MVXA
Meinst du jetzt den Ordner bin oder meinst du Pfad zum Programm?

Verfasst: 11.04.2006 09:36
von vonTurnundTaxis
Den Pfad zum Programm.
Der Pfad zu /bin/ wird sich wohl kaum ändern ;)

Verfasst: 11.04.2006 15:09
von Eric
/proc/self/exe bzw. /proc/(prozessid)/exe ist ein symbolischer Link auf das Programm.

Ich hab dazu ein Programm geschrieben, hab aber gerade kein Linux mit PB um es zu testen.

Code: Alles auswählen

mem=AllocateMemory(1024)
b.s="/proc/self/exe"
c.l=@b
!mov eax,85       ;int sys_readlink(const char * path, char * buf, int bufsiz)
!mov ebx,[v_c]
!mov ecx,[v_mem]
!mov edx,1024
!int 0x80
MessageRequester("",GetPathPart(PeekS(mem)))
(Vielleicht ist PB auch nicht so glücklich, wenn ich einfach irgendwelche Register verändere)

Verfasst: 11.04.2006 15:13
von MVXA
es sollte eigentlich damit klar kommen Die voher aber zu sichern
dürfte nicht schaden.

Verfasst: 11.04.2006 16:23
von MARTIN
@Eric
Hast du dich beim Register edx -> ecx verschreiben.
Ansonsten schade das PB solche funktion nicht hat, so muss für jedes Betriebsystem was anderes frickeln.

Verfasst: 11.04.2006 17:01
von Eric
Whoops, da hab ich doch glatt ecx vergessen /:->
Ich habe es jetzt korrigiert, eax ebx ecx edx sollte stimmen.
Hat jemand es schon getestet?

Verfasst: 11.04.2006 17:37
von MARTIN
Ja, es funktioniert schon (warum auch nicht).
Allerdings nur auf 32bit Systemen, was da für 64bit geändert werden muss weiss ich so noch nicht.

Verfasst: 11.04.2006 19:29
von Eric
Macht es als 32bit-Anwendung unter 64bit-Linux Probleme
(Oder hab ich etwa was verpasst und es gibt ein 64bit-PB? :lol: )
Und kommt eine Fehlermeldung? (general protection fault oder so?)
64bit-Prozessoren haben einen neuen Speicherschutz...

Verfasst: 12.04.2006 17:06
von MVXA
Ich habe nochmal kurz rum gekrammt und einen etwas ältern Source
gefunden:

Code: Alles auswählen

Procedure.s GetAppDir()
    Protected lBuffer.l, lLen.l
    Protected sOut.s
    
    lBuffer = AllocateMemory(2048+1)
    CompilerSelect #PB_Compiler_OS 
        CompilerCase #PB_OS_Windows
            GetModuleFileName_(#Null, lBuffer, #MAX_PATH)
            sOut = GetPathPart(PeekS(lBuffer))
            If Right(sOut, 1) <> "\": sOut + "\": EndIf
    
        CompilerCase #PB_OS_Linux
            lLen = Readlink_("/proc/" + Str(getpid_()) + "/exe", lBuffer, 2048) 
            sOut = GetPathPart(PeekS(lBuffer, lLen))
    CompilerEndSelect
    FreeMemory(lBuffer)
    
    ProcedureReturn sOut
EndProcedure

Procedure.s GetAppName()
    Protected lBuffer.l, lLen.l
    Protected sOut.s
    
    lBuffer = AllocateMemory(2048+1)
    CompilerSelect #PB_Compiler_OS 
        CompilerCase #PB_OS_Windows
            GetModuleFileName_(#Null, lBuffer, 2048)
            sOut = GetFilePart(PeekS(lBuffer))
    
        CompilerCase #PB_OS_Linux
            lLen = Readlink_("/proc/" + Str(getpid_()) + "/exe", lBuffer, 2048) 
            sOut = GetFilePart(PeekS(lBuffer, lLen))    
    CompilerEndSelect
    FreeMemory(lBuffer)
    
    ProcedureReturn sOut
EndProcedure 
Macht das gleiche wie Erics Code aber benutzt dazu die libc und
funktioniert auf Windows und Linux.