2

我试图在一开始就从另一个进程分叉一个进程。为此,我尝试修改__libc_start_mainglibc(我使用的修改后的 glibc)中的函数并尝试将 fork 放在那里,但无法编译 glibc,因为每当我尝试这样做时都会出错。还有哪些其他选择,为什么插入叉子__libc_start_main不起作用?

再次注意,我想以一种不需要修改程序的方式来做,即在 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
4

1 回答 1

1

如果您使用主入口点静态链接到不可修改的对象,则可以使用符号包装在对象的 main() 之前潜入 fork()。

例如,无法修改的 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
于 2012-05-24T02:43:36.247 回答