Prawdopodobnie nie powinieneś tego robić, ale możesz. Odpowiedź Kusalanandy jest lepsza dla danego zadania i wyjaśnia problem. Ponieważ pytałam konkretnie jak używać żadnych połączeń biblioteki wewnątrz terminalu, chociaż, oto kilka sposobów ...
Tiny C Compiler ( tcc
) obsługuje -run
flagę , która pozwala (w efekcie) interpretowania kodu C pisząc mały program, dzięki czemu można korzystać z żadnych połączeń biblioteki wewnątrz terminala za pomocą jednego wywołania tego.
Możesz uruchomić następującą strnlen
funkcję:
$ tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", strnlen(argv[1], 1024));}') "Hello world"
11
Używa podstawienia procesów z Bash, zsh i innych powłok, aby dać tcc
plik do odczytu, który wydaje się zawierać wyniki wszystkich echo
s; są inne opcje.
Możesz stworzyć funkcję, która wygeneruje to dla Ciebie:
call_library_function_s_i() {
func=$1
shift
tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", '$func'(argv[1]));}') "$*"
}
$ call_library_function_s_i strlen hello world
(Użyłem strlen
tutaj, aby była to jednoargumentowa funkcja string-> int - potrzebujesz osobnej funkcji dla każdego innego arity i typu zwracanego).
Inną opcją jest Bash plugin przez Tavis Ormandy, który owija się i . Jest to prawdopodobnie najbliższe przybliżenie do tego, czego próbujesz. Możesz użyć na przykład:ctypes.sh
dlopen
dlsym
$ dlcall -r uint64 strlen "hello world"
i wywoła funkcję zgodnie z oczekiwaniami.
Jest to najbardziej bezpośredni sposób na zrobienie tego „z terminala”, ale jest mało prawdopodobne, aby był to pakiet twoich pakietów dystrybucyjnych, więc będziesz musiał zainstalować go ręcznie (co nie jest łatwe). Oto kilka ciekawych cytatów z ctypes.sh
własnej strony internetowej, które dają ogólne wrażenie na temat tego, jak ludzie to robią:
- "to jest obrzydliwe"
- „to musi się skończyć”
- „posunąłeś się za daleko”
Mogą istnieć podobne narzędzia do innych powłok, ale nie wiem o nich. Teoretycznie nie ma powodu, aby nie istniało samodzielne polecenie, które zrobiłoby to dokładnie w prostych przypadkach, ale jestem nieco zaskoczony, że nie udało mi się znaleźć jednego ...
... więc zrobiłem jeden! dlcall
pozwala wywoływać funkcje biblioteczne z wiersza poleceń :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Obsługuje ograniczony zestaw prototypów funkcji, obecnie nie jest strasznie niezawodny ani odporny, ale teraz istnieje.
Możesz także użyć na przykład Pythona ipython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, ale z pewnością nie jest to najłatwiejszy sposób. Perl, Ruby i inne języki mają podobne funkcje, których możesz użyć.
Odpowiedzi na twoje pytania to:
- Użyj jednego z powyższych podejść.
- Państwo nie trzeba użyć innego polecenia załadowania cię do biblioteki, albo kawałek oprogramowania, które haków do swojej skorupy.
Podsumowując, prawie na pewno lepiej będzie robić to w jakikolwiek inny sposób.