[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:28551] Re: Plamo-4.22のinstallに関連して



としです。

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 公開システム