2012-05-18 1 views
2

Я пытаюсь запустить процесс из другого в начале. Для этого я попытался изменить функцию __libc_start_main в glibc (модифицированный glibc, который я использую), и попытался поместить туда вилку, но не смог скомпилировать glibc, поскольку он дает ошибку, когда я пытаюсь это сделать. Какие другие варианты и почему вставка fork в __libc_start_main не работает?Как запустить два экземпляра процесса через fork без изменения программы

Снова обратите внимание, что я хочу сделать это так, чтобы не требовалась никакая модификация программы, то есть модификация в glibc в порядке, но не в программе.

В __libc_start_main, я стараюсь развиваться следующим образом.

if (__builtin_expect (! not_first_call, 1)) 
    { 
     struct pthread *self; 
     fork(); // <-- here 

     self = THREAD_SELF; 

     /* Store old info. */ 
     unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf); 
     unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup); 

     /* Store the new cleanup handler info. */ 
     THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf); 

     /* Run the program. */ 
     result = main (argc, argv, __environ MAIN_AUXVEC_PARAM); 
    } 

Ошибка, которую я получаю, следующая.

file '/build/sunrpc/xbootparam_prot.T' already exists and may be overwritten 
make[2]: *** [build/sunrpc/xbootparam_prot.stmp] Error 1 
+0

какая ошибка вы получаете при компиляции вашего измененного libc? – philant

+0

Почему бы вам просто не создать программу-оболочку, переименовать ее в нечто другое, а в программе-оболочке-оболочке и exec, а просто выполнить переименованный процесс? –

+0

Если у вас нет статических данных, вы можете 'fork()' first thing в 'main()'. Вам придется подумать о дескрипторах файлов и обработчиках сигналов, и все это конечно. –

ответ

1

Если вы статически ссылки на неизменяемый объект с главной точкой входа, вы можете использовать символ обертку, чтобы проникнуть вилку() до объекта, основной().

Например, main.o, которые не могут быть изменены:

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    printf("In main()\n"); 
    return 0; 
} 

Ваш символ обертка в Glibc:

#include <unistd.h> 
#include <stdio.h> 

int __wrap_main(int argc, char *argv[]) { 
    printf("In wrapper\n"); 
    if (fork()) { 
     return __real_main(argc, argv); 
    } else { 
     printf("Other process did something else\n"); 
     return 0; 
    } 
} 

И использовать --wrap команду команду компоновщика:

gcc -o app main.o wrap.o -Wl,--wrap=main 

$ ./app 
In wrapper 
In main() 
$ Other process did something else 
Смежные вопросы