@takarakasai
スタート低レイヤー6 #start_printf
今回やるところ
←ここやります!
対象はNetBSD 6.0.1 だよ!
int命令どこ?
 src/lib/libc/arch/i386/SYS.h 75~
#define OSYSTRAP(x) ¥
movl _SYSNAM(x),%eax ;¥
int $0x80
 int と 0x80 でgrepするとこれが出てくるけど…
libc の Makefile.inc から追う
 lib/libc/sys/Makefile.inc 167~
ASMDEPS= ${.CURDIR}/sys/Makefile.inc ${ARCHDIR}/SYS.h ¥
${DESTDIR}/usr/include/sys/syscall.h
…
${WEAKASM}: ${ASMDEPS}
${_MKTARGET_CREATE}
printf '#include
"SYS.h"¥nWSYSCALL(${.PREFIX},_sys_${.PREFIX})¥nWEAK_ALIAS(_${.PREFIX},_sys_${.PREFIX})¥n'
>${.TARGET}
…
WEAKASM= accept.S __aio_suspend50.S close.S connect.S execve.S ¥
…
__wait450.S write.S writev.S
 write.S は./sys/Makefile.inc, i386/SYS.h,
$DEST/usr/include/sys/syscall.h から生成される.
 printf で${.TARGET} = write.S が作成される.
展開してみる
 lib/libc/sys/Makefile.inc
printf '#include
"SYS.h"¥nWSYSCALL(${.PREFIX},_sys_${.PREFIX})¥nWEAK_ALIAS(_${.PREFIX},_sys_${.PREFIX})¥n'
>${.TARGET}
 WSYSCALL, WEAK_ALIAS ?
#include “SYS.h”
WSYSCALL(${.PREFIX},_sys_${.PREFIX})
WEAK_ALIAS(_${.PREFIX},_sys_${.PREFIX})
 ${.TARGET}
#include “SYS.h”
WSYSCALL(write,_sys_write)
WEAK_ALIAS(_write,_sys_write)
 write.S
WSYSCALL, WEAK_ALIAS
 sys/arch/i386/include/asm.h 195-
#define WEAK_ALIAS(alias,sym) ¥
.weak alias; ¥
alias = sym
#endif
#include “SYS.h”
.weak write
alias = _sys_write
PSEDO(_sys_write, write)
.weak _write
alias = _sys_write
 write.S
 sys/arch/i386/include/asm.h 195-
#define WSYSCALL(weak,strong) ¥
WEAK_ALIAS(weak,strong); ¥
PSEUDO(strong,weak)
さらに展開
#include “SYS.h”
.weak write
alias = _sys_write
ENTRY(_sys_write);
SYSTRAP(wirte) >> #define SYSTRAP(x) OSYSTRAP(x)
jc 2f;
ret;
2: _SYSCALL_ERR
.weak _write
alias = _sys_write
 write.S
さらにさらに展開
#include “SYS.h”
.weak write
alias = _sys_write
ENTRY(_sys_write);
movl $(SYS_write),%eax ;
int $0x80
jc 2f;
ret;
2: _SYSCALL_ERR
.weak _write
alias = _sys_write
 write.S
#define SYS_write 4
 sys/sys/syscall.h:28
 eax に システムコール番号入れて int 0x80 よんでる!
さらにさらにさらに展開
#include “SYS.h”
.weak write
alias = _sys_write
.text: _ALIGN_TEXT; .globl _sys_write; .type _sys_write; @function: _sys_write:
movl $(SYS_write),%eax ;
int $0x80
jc 2f;
ret;
2: jmp __cerror // cの関数
.weak _write
alias = _sys_write
 write.S
 weak シンボル( write, _write)
 global / text シンボル( _sys_write)
 Undefined シンボル (__cerror)
がnetbsd の libc.a にある?
ほんとにあってる?
>> nm libc.a
…
write.o:
U __cerror
00000000 T _sys_write
00000000 W _write
00000000 W write
…
 write.S
 あってるようです

Start printf 6_takarakasai