2

最初にプロセスを別のプロセスからフォークしようとしています。このために、私__libc_start_mainは glibc (私が使用する変更された glibc) の関数を変更しようとし、そこにフォークを配置しようとしましたが、コンパイルしようとするとエラーが発生するため、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 に答える