トップ «前の日記(2006-02-24) 最新 次の日記(2006-02-26)» 編集

復活作業中日記

2005|09|10|11|12|
2006|01|02|03|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|08|09|10|11|12|
2015|01|03|04|08|09|10|12|
2016|01|02|05|06|07|08|09|10|11|
2017|07|

ToDo:

  • 10 3500円借りてる
  • 01 34000円貸してる

2006-02-25 [長年日記]

_ 脳内肉の日

久しぶりに、食べ放題では無い肉。

_ [Momonga]glibc-2.3.90を投入しましたよ

次は、coMomongaのリリース準備か。

_ [Momonga][Linux] glibc-2.4(2.3.90)&gcc-4.1メモ

mixiにメモっておいたのを引き上げてみるよ。

もともと、gcc-4.1にもlibsspと言う形でssp(stack-smash protect)が入っていますが、これを使用してディストリビューションを構築しようとすると、非常に面倒臭いです。

glibc-2.4(2.3.90)にも、sspが標準で入っているのですが、こちらはlibc.soに取り込まれているので、こちらを使うのが簡単ですが、gccとglibcの下拵えが必要なのでメモ。

さて、glibcのsspはlibc内蔵の関数をリンクするので、-fstack-protector時に、-lsspとかが付いてはいけないです(付くと、gcc側のlibsspをリンクするから)。

-lsspが清く正しく、美しく消えてくれれば良いので、調査。Fedoraはパッチとか当ててないのに、うまい事やっているので、手があるに違いありませんね。

さて、gcc-4.1のソースを眺めると、gcc/gcc.cで以下のように定義されています。"TARGET_LIBC_PROVIDES_SSP"が有効になれば、-lsspが抜けて、glibcのsspを使ってくれる気配ですね。

#ifndef LINK_SSP_SPEC
#ifdef TARGET_LIBC_PROVIDES_SSP
#define LINK_SSP_SPEC "%{fstack-protector:}"
#else
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
#endif
#endif

次は、TARGET_LIBC_PROVIDES_SSPを調べるぞ。って事で次へ

_ [Momonga][Linux] 続・glibc-2.4(2.3.90)&gcc-4.1メモ

さて、gcc/configure.acで以下のように定義されてます。

# glibc 2.4 and later provides __stack_chk_fail and
# either __stack_chk_guard, or TLS access to stack guard canary.
if test -f $glibc_header_dir/features.h \
&& $EGREP '^@<:@ @:>@*#[ ]*define[ ]+__GNU_LIBRARY__[ ]+([1-9][0-9]|[6-9])' \
$glibc_header_dir/features.h > /dev/null; then
if $EGREP '^@<:@ @:>@*#[ ]*define[ ]+__GLIBC__[ ]+([1-9][0-9]|[3-9])' \
$glibc_header_dir/features.h > /dev/null; then
gcc_cv_libc_provides_ssp=yes
elif $EGREP '^@<:@ @:>@*#[ ]*define[ ]+__GLIBC__[ ]+2' \
$glibc_header_dir/features.h > /dev/null \
&& $EGREP '^@<:@ @:>@*#[ ]*define[ ]+__GLIBC_MINOR__[ ]+([1-9][0-9]|[4-9])' \
$glibc_header_dir/features.h > /dev/null; then
gcc_cv_libc_provides_ssp=yes
fi
fi]) ;;
  • __GNU_LIBRARY__ が6以上(6〜99)の時に、
    • __GLIBC__ が3以上(3〜99) 又は、
    • __GLIBC__ が2かつ、__GLIBC_MINOR__ が4以上(6〜99)

の時に(glibc-2.4.0以上)、glibcがsspを持ってるぜ!とconfigureが理解してくれます。

ちなみに、glibc-2.3.90-36(Fedora)では、include/feuture.hで以下のように定義されています。

#define __GNU_LIBRARY__ 6

/* Major and minor version number of the GNU C library package. Use
these macros to test for features in specific releases. */
#define __GLIBC__ 2
#define __GLIBC_MINOR__ 4

glibc-2.3.90(2.4)を入れた後に、gccをビルドすれば、glibcのsspを使おうとするようですね。

_ [Momonga][Linux] 続々・glibc-2.4(2.3.90)&gcc-4.1メモ

ここまででわかったことは、

  • glibc-2.4(2.3.90)を入れると、「gccがglibc側のsspを使おうとする」

glibcでsspを有効にする条件が入っていません。

glibcのsspを有効にするための下拵えをざっくりと説明すると。

「configureの際に、-fstack-protectorが使える環境だとsspをenableにします。」

Momongaに入っているgcc-4.1はビルド時に、libsspを削除しているので、最初にglibcをビルドする際は、-fstack-protectorの依存関係を解消できず(-lsspが失敗するから)、configureでは以下のようになります。

checking for -fstack-protector... no

しかし、glibcを入れた後に、gccをリビルドすると、上の方で書いてある

 #define LINK_SSP_SPEC "%{fstack-protector:}"

が有効になり、-fstack-protector時に、-lsspを行いません。そのため、

checking for -fstack-protector... yes

になって、めでたくssp入りglibcができます。

良かった良かった。

sspを試すために、こんなソースをビルドしてみると

#include <string.h>
int main(void){
    char arr[16];
    strcpy(arr,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    return 0;
}
bash-3.00$ gcc test.c -fstack-protector
bash-3.00$ ./a.out
*** stack smashing detected ***: ./a.out terminated
アボートしました

おー。上手く効いているようですな。