Ви, мабуть, не повинні цього робити, але можете. Відповідь Кусалананди краще відповідне завдання та пояснює питання. Оскільки ви запитували конкретно, як використовувати будь-які дзвінки з бібліотеки всередині терміналу, ось декілька способів ...
Tiny C Compiler ( tcc
) підтримує -run
прапор , який дозволяє вам (в дійсності) витлумачити C код, написавши невелику програму, так що ви можете використовувати бібліотечні виклики всередині терміналу через один виклик цього.
Ви можете запустити strnlen
функцію так:
$ 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
Для цього використовується підміна процесу з Bash, zsh та інших оболонок, щоб дати tcc
файлу для читання, який, як видається, містить результати всіх echo
s; є й інші варіанти.
Ви можете створити функцію для створення цього для вас:
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
(Я strlen
тут використовував так, що це унарна функція string-> int - вам знадобиться окрема функція для кожного різного типу аритії та повернення).
Іншим варіантом є плагін Bash по Tavis Орманді, який обертає і . Це, мабуть, найближче наближення до того, що ви намагалися. Ви можете використовувати, наприклад:ctypes.sh
dlopen
dlsym
$ dlcall -r uint64 strlen "hello world"
і він викличе функцію, як очікувалося.
Це найбільш прямий спосіб зробити це "з терміналу", але навряд чи це буде щось із ваших пакунків для розповсюдження, тому вам доведеться встановлювати його вручну (що нетривіально). Ось кілька інформативних цитат з ctypes.sh
власного веб-сайту, щоб створити загальне враження про те, як люди почуваються з цього приводу:
- "Це огидно"
- "це має зупинитися"
- "Ви занадто далеко пішли з цим"
Можуть бути подібні інструменти для інших снарядів, але я не знаю про них. Теоретично немає причин, щоб не могло існувати окрема команда, яка зробила це саме для простих випадків, але я дещо здивований, що не зміг знайти її ...
... так я зробив один! dlcall
дозволяє викликати функції бібліотеки з командного рядка :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Він підтримує обмежений набір прототипів функцій, в даний час це не надзвичайно надійно або еластично, але зараз воно існує.
Ви також можете використовувати, наприклад, Python іpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, але це, звичайно, не найпростіший спосіб зробити це. Perl, Ruby та інші мови мають подібні функції.
Тож відповіді на ваші запитання:
- Скористайтеся одним із вищезазначених підходів.
- Ви дійсно повинні використовувати іншу команду для початкового завантаження вам в бібліотеку, або частина програмного забезпечення , що гачки в вашу оболонку.
Загалом, вам майже напевно буде краще робити це будь-яким іншим способом.