system 의 경우 결국
execve("/bin/sh", "-c", "blabla...");
이거고
execl 의 경우
execve("blabla", "arg1", ...);
이거인데.
원래 execve 자체는 PWD 상에 실행할 프로그램을 검색하지만
/bin/sh -c 로 주어지는 프로그램은
정확한 PATH 변수에 있는경우만 뒤져서 실행됨.
이것때문에 차이가남...
예를들어 execlp 같은경우 PATH 환경변수 의 디렉토리들을 뒤지면서 "nit" 명령을 아래처럼 찾음...
Breakpoint 3, 0x556434c0 in execve () from /lib/i386-linux-gnu/libc.so.6
(gdb) b *0x556434e8
Breakpoint 4 at 0x556434e8
(gdb) c
Continuing.
Breakpoint 4, 0x556434e8 in execve () from /lib/i386-linux-gnu/libc.so.6
(gdb) x/s $ebx
0xffe52e29: "/usr/local/bin/nit"
(gdb) c
Continuing.
Breakpoint 3, 0x556434c0 in execve () from /lib/i386-linux-gnu/libc.so.6
(gdb) c
Continuing.
Breakpoint 4, 0x556434e8 in execve () from /lib/i386-linux-gnu/libc.so.6
(gdb) x/s $ebx
0xffe52e2e: "/usr/sbin/nit"
(gdb)
하지만 execl 은 그냥 절대경로면 실행하고 아니면 PWD 에서 프로그램을 찾아보고 땡... 이런식으로 exec 계열들마다 상대경로 처리방식에 차이가남.
'Programming' 카테고리의 다른 글
BPF vs eBPF (0) | 2018.05.18 |
---|---|
OSX routing table setup (0) | 2016.08.06 |
ARM DACR basics (0) | 2016.07.13 |
Intel SGX basics (1) | 2016.07.12 |
Mount QEMU qcow image (0) | 2015.12.17 |