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
|