LINUX.ORG.RU

Re: А можно обычный динамический экзешник подгрузить через dlopen()?

Можно спросить: а зачем, если все равно вызывать main?

Deleted ()
Ответ на: ytfyt от int_0dh

Re: ytfyt

;-)

я так не решил.

мне показалось что сходу дёргнуть main должно быть вполне работоспособно...

cvv ★★★★★ ()

Re: А можно обычный динамический экзешник подгрузить через dlopen()?

Так попробуйте! (Мне кажется, что работать не будет).

birdie ★★★★★ ()
Ответ на: Re: ytfyt от cvv

ytfyt

в принципе мысль интересная, что-то функционально подобное vfork()/execve() :)

но кто, например, выполнит код инициализации хотя бы?

int_0dh ()
Ответ на: Re: ytfyt от cvv

Re: ytfyt

Вот я заинтересовался и решил попробовать - да не тут то было! dlopen() выдает ошибку "cannot dynamically load executable".
Код:

/* testprogram.c */

#include <stdio.h>

int main(int argc, char *argv[])
{
  while (*(++argv))
    printf("%s ", *argv);
  putchar('\n');

  return 0;
}

==========

/* testloader.c */

#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

#define      module_filename "./testprogram"

#define      module_argc 3
static char* module_argv[module_argc] =
  {
    module_filename,
    "Hello",
    "LOR!"
  };

int main(void)
{
  void *module_handle;
  int (* module_main_func)(int, char **);

  module_handle = dlopen(module_filename, RTLD_LAZY);
  if (! module_handle)
    {
      fprintf(stderr, "%s\n", dlerror());
      exit(1);
    }
  dlerror();
  module_main_func = dlsym(module_handle, "main");
  if (! module_main_func)
    {
      fprintf(stderr, "%s\n", dlerror());
      exit(1);
    }
  printf("program have exit with code %d\n", (* module_main_func)(module_argc, module_argv));
  dlclose(module_handle);

  return 0;
}

===========

# Makefile

all:
	cc -dynamic -o testprogram testprogram.c
	cc -o testloader testloader.c -ldl

Deleted ()
Ответ на: Re: ytfyt от Deleted

Re: ytfyt

> cc -dynamic -o testprogram testprogram.c

-fpic?

swizard ()
Ответ на: Re: ytfyt от swizard

Re: ytfyt

> У меня (freebsd) собралось и сработало

Только testprogram при этом перестал быть исполняемым бинарем ;)

swizard ()
Ответ на: Re: ytfyt от swizard

Re: ytfyt

> сс -fpic -shared -o testprogram testprogram.c

Так работает, однако тогда testprogram не запускается сама по себе:

$ ./testprogram
Segmentation fault (core dumped)

Deleted ()
Ответ на: Re: ytfyt от swizard

Re: ytfyt

> У меня (freebsd) собралось и сработало при
> сс -fpic -shared -o testprogram testprogram.c

...что не удивительно бо с -shared вы собираете разделяемую библиотеку которая как пить дать должна работать с dlopen().. ;)

// wbr

klalafuda ★☆☆ ()
Ответ на: Re: ytfyt от Deleted

Re: ytfyt

Как я понимаю, это из-за того, что на выходе получается библиотека, а не executable?

Deleted ()

Re: А можно обычный динамический экзешник подгрузить через dlopen()?

Ок. а кто нибуть может сказать чем принципиально отличается либа от екзешника?

битом execution? флагом в ELF - заголовке?

cvv ★★★★★ ()

ytfyt

бинарник не является PIC, (а ему как-то нужно, например, получать доступ к GOT и PLT).

Если он PIC и слинкован статически, то вы можете сами отмапить его, подготовить минимальный environment и передать управление на точку входа. ИМХО довольно забавно.

int_0dh ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.