Probablemente no deberías hacer esto, pero puedes. La respuesta de Kusalananda es mejor para la tarea en cuestión y explica el problema. Sin embargo, dado que usted preguntó específicamente cómo usar las llamadas a la biblioteca dentro del terminal, aquí hay algunas maneras ...
El Compilador Tiny C ( tcc
) admite un -run
indicador que le permite (en efecto) interpretar el código C escribiendo un pequeño programa, para que pueda usar cualquier llamada a la biblioteca dentro del terminal a través de una sola invocación de eso.
Puede ejecutar la strnlen
función de esta manera:
$ 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
Esto utiliza la sustitución de procesos de Bash, zsh y otros shells para proporcionar tcc
un archivo para leer que parece contener los resultados de todos los echo
s; Hay otras opciones.
Podría hacer una función para generar esto para usted:
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
(Lo he usado strlen
aquí para que sea una función unaria string-> int: necesitaría una función separada para cada arity y tipo de retorno diferentes).
Otra opción es el ctypes.sh
complemento Bash de Tavis Ormandy, que finaliza dlopen
y dlsym
. Esta es probablemente la aproximación más cercana a lo que estaba intentando. Puedes usar, por ejemplo:
$ dlcall -r uint64 strlen "hello world"
y llamará a la función como se esperaba.
Esta es la forma más directa de hacerlo "desde el terminal", pero es poco probable que sea algo que su distribución empaquete, por lo que tendría que instalarlo manualmente (lo cual no es trivial). Aquí hay algunas citasctypes.sh
informativas del propio sitio web para dar una impresión general de cómo se siente la gente al hacer esto:
- "eso es asqueroso"
- "Esto tiene que parar"
- "has ido demasiado lejos con esto"
Puede haber herramientas similares para otros proyectiles, pero no los conozco. En teoría, no hay razón para que no haya un comando independiente que haga esto exactamente para los casos simples, pero estoy algo sorprendido de que no haya podido encontrar uno ...
... así que hice uno! dlcall
le permite llamar a funciones de biblioteca desde la línea de comandos :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Admite un conjunto limitado de prototipos de funciones, actualmente no es terriblemente confiable ni resistente, pero ahora existe.
También podría usar, por ejemplo, Python ypython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, pero ciertamente no es la forma más fácil de hacerlo. Perl, Ruby y otros idiomas tienen características similares que podrías usar.
Entonces las respuestas a sus preguntas son:
- Use uno de los enfoques anteriores.
- Usted no necesita usar otro comando para que arrancar en la biblioteca, o una pieza de software que los ganchos en su concha.
Con todo, seguramente será mejor que hagas esto de otra manera.