システムコール( _exit(2))が要求される

main()を直接読んでもダメだった理由はシステムコール_exit()が呼ばれていないからとの事だった。 そこで上記ブログを参考にエントリポイントをmainにしたELFバイナリでセグフォらない用にした。 完全にコピペ記事である。

システムコール _exitを直接呼ぶ部分は最初のブログを真似して書いた。 自分の環境では/usr/include/asm/配下に_syscall1なるマクロが存在しなかったため不安だったが普通に動いた。 システムコールを直接呼び出す方法やらは調べたほうがよさそう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
int errno;
void _exit(int status) {
  long __res;

  __asm__ volatile ("int $0x80" :  \
                    "=a" (__res) : \
                    "0" (1), "b" ((long)(status)) : \
                    "memory");
  do {
    if ((unsigned long) (__res) >= (unsigned long)(-(128 + 1))) {
      errno = -(__res); __res = -1;
   }
  return (void) (__res);
 } while (0);
}

int main() {
  _exit(100);
  return 123;
}

上記のコードを用いて以下を実行する事で目当ての実行バイナリで実行する。

1
2
3
4
$ gcc -Wall -fno-builtin -c ./sample.c
$ ld -e main -o main.sample ./sample.o
$ ./main.sample; echo $?
100
comments powered by Disqus