Bạn có thể không nên làm điều này, nhưng bạn có thể. Câu trả lời của Kusalananda là tốt hơn cho nhiệm vụ trong tay và giải thích vấn đề. Vì bạn đã hỏi cụ thể cách sử dụng bất kỳ cuộc gọi thư viện nào bên trong thiết bị đầu cuối, tuy nhiên, đây là một vài cách ...
Các C Compiler Tiny ( tcc
) hỗ trợ một -run
lá cờ cho phép bạn (có hiệu lực) giải thích mã C bằng cách viết một chương trình nhỏ, vì vậy bạn có thể sử dụng bất kỳ cuộc gọi thư viện bên trong thiết bị đầu cuối thông qua một invocation duy nhất đó.
Bạn có thể chạy strnlen
chức năng như thế này:
$ 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
Điều này sử dụng thay thế quá trình từ Bash, zsh và các shell khác để cung cấp tcc
một tệp để đọc có vẻ như chứa kết quả của tất cảecho
s; Có những lựa chọn khác.
Bạn có thể tạo một hàm để tạo cái này cho bạn:
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
(Tôi đã sử dụng strlen
ở đây để nó là một chuỗi hàm unary-> int - bạn cần một hàm riêng cho từng loại trả về và mức độ khác nhau).
Một lựa chọn khác là các ctypes.sh
Plugin Bash bởi Tavis Ormandy, mà kết thúc tốt đẹp dlopen
và dlsym
. Đây có lẽ là gần đúng nhất với những gì bạn đã cố gắng. Bạn có thể sử dụng, ví dụ:
$ dlcall -r uint64 strlen "hello world"
và nó sẽ gọi hàm như mong đợi.
Đây là cách trực tiếp nhất để thực hiện "từ thiết bị đầu cuối", nhưng không chắc là thứ gì đó phân phối các gói của bạn nên bạn phải cài đặt thủ công (không cần thiết). Dưới đây là một số trích dẫnctypes.sh
thông tin từ trang web của chính mình để tạo ấn tượng chung về cách mọi người cảm nhận về việc này:
- "thật kinh tởm"
- "Điều này phải chấm dứt"
- "bạn đã đi quá xa với điều này"
Có thể có các công cụ tương tự cho các shell khác, nhưng tôi không biết về chúng. Về lý thuyết, không có lý do gì không thể có một lệnh độc lập thực hiện chính xác các trường hợp đơn giản này, nhưng tôi hơi ngạc nhiên khi tôi không thể tìm thấy một ...
... Vì vậy, tôi đã thực hiện một! dlcall
cho phép bạn gọi các chức năng thư viện từ dòng lệnh :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Nó hỗ trợ một bộ nguyên mẫu hàm hạn chế, hiện tại nó không đáng tin cậy hoặc có khả năng phục hồi, nhưng hiện tại nó đã tồn tại.
Bạn cũng có thể sử dụng, ví dụ như Python vàpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, nhưng chắc chắn đó không phải là cách dễ nhất để nói về nó. Perl, Ruby và các ngôn ngữ khác có các tính năng tương tự bạn có thể sử dụng.
Vì vậy, câu trả lời cho câu hỏi của bạn là:
- Sử dụng một trong những cách tiếp cận ở trên.
- Bạn làm cần phải sử dụng lệnh khác để bootstrap bạn vào thư viện, hoặc một phần của phần mềm mà móc vào shell của bạn.
Nói chung, bạn gần như chắc chắn sẽ tốt hơn khi làm điều này theo bất kỳ cách nào khác.