Можно.
Почитайте о разделяемых библиотеках (.so), посмотрите man dlopen
(в винде тоже есть что-то похожее, свое, см. в сторону .dll).
Вот "для затравки" совсем небольшой ленивый примерчик:
avp@avp-xub11:lib$ cat t1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int
main (int ac, char *av[])
{
if (ac <= 0 || ac > 100) { // а это кривая проверка "самовызова"
printf("self-call: %s\n", (char *)ac);
return 0;
}
void *my = dlopen(0, RTLD_NOW);
if (!my) {
printf("dlopen: %s\n", dlerror());
exit(1);
}
int i;
for (i = 1; av[i]; i++) {
void (*f)() = dlsym(my, av[i]);
if (!f)
printf("function [%s] not found\n", av[i]);
else
f(av[i]), puts("");
}
return puts("End") == EOF;
}
avp@avp-xub11:lib$ gcc t1.c -ldl -rdynamic
avp@avp-xub11:lib$ ./a.out f1 puts printf main
function [f1] not found
puts
printf
self-call: main
End
avp@avp-xub11:lib$
Программа открывает саму себя (загрузочный модуль) как разделяемую библиотеку, а также наследует уже подключенные загрузчиком другие .so и вызывает функции, имена которых передаются в аргументах main()
.
Только учтите, правильность передачи параметров никто не проверяет. Вы должны знать, какие параметры принимает функция и обязаны сами вызывать ее правильно.