[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[plamo:28551] Re: Plamo-4.22のinstallに関連して
-
From:TANAKA Toshihisa
-
Date:Wed, 24 Oct 2007 10:22:42 +0900 (JST)
- Subject: [plamo:28551] Re: Plamo-4.22のinstallに関連して
- From: TANAKA Toshihisa <tosihisa@xxxxxxxxxxxxx>
- Date: Wed, 24 Oct 2007 10:22:34 +0900
- Organization: NetFort
としです。
On Mon, 22 Oct 2007 13:11:08 +0900 (JST)
KOJIMA Mitsuhiro <kojima@xxxxxxxxxxx> wrote:
> よく分からないけど,とりあえず sysdeputil.c の 162 行目,
>
> _syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)
>
> の部分をコメントアウトしてやればコンパイルは通るようですね.
>
> # ちゃんと動くかどうかの確認はしていませんが.
もし、(g)libc で capset() が使える(コンパイル&リンクが通る)
なら、_syscall2(...) はコメントアウトで問題ないと思います。
> 素直に C の文法的に見ると,
>
> #include <errno.h>
> #include <syscall.h>
> _syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)
> /* Gross HACK to avoid warnings - linux headers overlap glibc headers */
>
> この _syscall2 の行は # で始まるマクロでもないし,; で終る文でもないの
> でエラーになって当然のような気はするのだけど,syscall.h をインクルード
> したあとだと,何か特別の処理があったりするのだろうか?
man 2 intro に記述がありますが、_syscallX() はマクロで Linux
システムコール「そのもの」を呼び出す実体になります。
例えば、
--[syscall.c]--
#include <errno.h>
#include <unistd.h>
_syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)
上記のソースを、
$ gcc -nostdinc -I /usr/src/linux/include -I /usr/src/linux/include/linux/ -D__KERNEL__ -E syscall.c
でコンパイルすると、
# 3 "syscall.c" 2
int capset(cap_user_header_t header,const cap_user_data_t data) { long
__res; __asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; po
p %%ebx" : "=a" (__res) : "0" (185),"ri" ((long)(header)),"c" ((long)(
data)) : "memory"); do { if ((unsigned long)(__res) >= (unsigned long)
(-(128 + 1))) { errno = -(__res); __res = -1; } return (int) (__res);
} while (0); }
と capset() の関数「実体」に置き換えられます。中身はインラインアセンブ
ラで int $0x80 があり、これがユーザプロセスからカーネル機能(syscall)を
呼び出す「接合点」になります。MS-DOS の 「int 21h」に相当するものです。
多分、ですが、_syscall2() が入っている理由は、カーネルが capset() をサ
ポートしているが、(g)libc で capset() をサポートしていない場合の対処で
はないかと思います。
#(g)libc で、capset() と言う関数が無い場合の対処だと思います。
(g)libc で capset() をサポートしている(コンパイルとリンクが通る)なら、
この _syscall2() は不要と思います。
ではこれにて。
- References
-
- [plamo:28541] Plamo-4.22のinstallに関連して, Takehiko Ogata
- [plamo:28543] Re: Plamo-4.22のinstallに関連して, KOJIMA Mitsuhiro
[検索ページ]
[メール一覧]
Plamo ML 公開システム