2015-12-02 17 views
7

v'è una descrizione molto bello sul caricamento di una libreria condivisa e chiamare una funzione con il pacchetto syscall su Windows (https://github.com/golang/go/wiki/WindowsDLLs). Tuttavia, le funzioni e LoadLibraryGetProcAddress che vengono utilizzati in questa descrizione non sono disponibili nel pacchetto syscall su Linux. Non sono riuscito a trovare documentazione su come farlo su Linux (o Mac OS).Golang: Come usare syscall.Syscall su Linux?

Grazie per l'aiuto

+0

È possibile trovare questo pacchetto utile: https://github.com/rainycape/dl –

+0

@TimCooper Si noti che "gopkgs.com" è irraggiungibile e [è un NXDOMAIN] (http://centralops.net/co/ DomainDossier.aspx? addr = gopkgs.com & dom_dns = true). Quindi è sicuro assumere che il sito è morto. –

+0

@MarkusWMahlberg: il pacchetto può ancora essere afferrato con 'go get -u github.com/rainycape/dl'. –

risposta

2

chiamate di sistema di Linux vengono utilizzati direttamente senza caricare una biblioteca, esattamente come dipende da quale sistema di chiamata che si desidera eseguire. Si dovrebbe fare riferimento al riferimento const delle chiamate di sistema a https://golang.org/pkg/syscall/

userò il getpid syscall Linux() come esempio, che restituisce l'ID di processo del processo chiamante (il nostro processo, in questo caso).

Secondo il nostro riferimento (link qui sotto), in Go questa chiamata di sistema ha un valore di 39 uintptr di, ed è elencato come SYS_GETPID. Nel tuo codice puoi definire un const, ad es. sysGetPid, con un valore di 39.

package main 

import (
    "fmt" 
    "syscall" 
) 

func main() { 
    pid, _, _ := syscall.Syscall(39, 0, 0, 0) 
    fmt.Println("process id: ", pid) 
} 

I catturare il risultato della chiamata di sistema in pid, questa chiamata particolare restituisce nessun errore per cui uso identificatori in bianco per il resto dei rendimenti. Syscall restituisce due uintptr e 1 errore.

Come si può vedere che posso anche solo passare 0 per il resto degli argomenti della funzione, come io non ho bisogno di passare gli argomenti a questa chiamata di sistema.

La firma funzione è: func Syscall (trappola uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err Errno)

Per le altre chiamate di sistema è necessario fare riferimento a un sistema riferimento di chiamata per Linux, ad es http://man7.org/linux/man-pages/man2/syscalls.2.html, per scoprire quali argomenti è necessario passare e cosa restituisce.

-1

ci sono alcuni esempi che posso trovare a codegrep. In particolare, date un'occhiata alla libreria dlopen che coreos utilizza here

Divulgazione completa: sto hackerando su codegrep.