(for Internet Explorer)
置換後のテキストに、シェルスクリプトのように $1, $2 ... を記述すると、パラメーターが使えます。
sample.m4
m4 sample.m4 を実行したときの出力

<IMG src="apple.jpg" alt="Apple"/>
define(`IMG_Tag',`<IMG src="$1" alt="$2"/>')
IMG_Tag(`apple.jpg',`Apple')
パラメーターが少ないときは、空文字列になります。

<IMG src="apple.jpg" alt=""/>
m4 sample.m4 を実行したときの出力
sample.m4
define(`IMG_Tag',`<IMG src="$1" alt="$2"/>')
IMG_Tag(`apple.jpg')
$0 … define マクロ名
$# … パラメーターの数
$@ … 全てのパラメーター
[ 親: m4 ]
$1
$2


Y XX
m4 sample.m4 を実行したときの出力
sample.m4
include(`m4lib.m4')
X XX
m4lib.m4
define(`X',`Y')
別のファイルの内容を取り込みます。
[ 親: m4 ]
sinclude(`m4lib.m4')
別のファイルが存在するときだけ取り込むときは、sinclude を使います。
include(`m4lib.m4')
sinclude(`m4lib.m4')
sample.m4
m4 sample.m4 を実行したときの出力


5:<IMG src="foo"/>
4:<IMG src="bar"/>
3:<IMG src="baz"/>
2:<IMG src="quux"/>
define(`IMG_Tag',`<IMG src="$1"/>')
define(`IMG_Tags',`ifelse( $#, 1, `$#:IMG_Tag($1)', `$#:IMG_Tag($1)
IMG_Tags(shift($@))')')
IMG_Tags(foo,bar,baz,quux)
shift と再帰を使って、複数に展開することができます。
sample.m4
define(`X',`Y 1')
define(`Y',`Z 2')
X
m4 sample.m4 を実行したときの出力


Z 2 1
define ディレクティブで置換したものの中に、他の define ディレクティブで定義されたシンボルが
あれば、更に置換されます。


Z 2 1
m4 sample.m4 を実行したときの出力
sample.m4
define(`Y',`Z 2')
define(`X',`Y 1')
X
define 定義の順番は、どちらが先でも同じです。
→ 置換されないようにする
関連
置換後、更に置換されないようにする
[ 親: m4 ]
Y
Y
Y
Y
置換される対象にしたくないときは、` ' で囲んでください。 m4 を実行したら ` ' は無くなります。
sample.m4
m4 sample.m4 を実行したときの出力

Y X
define(`X',`Y')
X `X'


Y Z
m4 sample.m4 を実行したときの出力
sample.m4
define(`X',``Y'')
define(`Y',`Z')
X Y
置換後に、更に置換されないようにするには、define ディレクティブに、`` '' で囲んでください。
` ' を残すときは、`` '' と記述してください。
sample.m4
m4 sample.m4 を実行したときの出力
`X'
``X''
[ 親: m4 ]
`X'
`Y'
``X''
[ 親: m4 ]
sample.m4
define(`X',`Y')
indir(`X')A XA
m4 sample.m4 を実行したときの出力

YA XA
define ディレクティブによる置換を行う対象は、シンボル(単語単位)です。

Y XX
m4 sample.m4 を実行したときの出力
sample.m4
define(`X',`Y')
X XX
単語の一部に対して置換を行うときは、置換する対象を indir(` ') で囲んでください。
XX は X を含んでいるが、
X という単語ではないため、置換されない。
indir(` ') の中に、未定義のシンボルがあったときは、エラーが出力されます。
ただし、終了ステータスは 0 のままです。


m4:sample1.m4:3: undefined macro `Y'
A
m4 sample.m4 を実行したときの出力
define(`X',`Y')
indir(`Y')A
sample.m4
X XX
indir(`X')
参考
→ SampleSo.tar.bz2
ダウンロード
動的リンクする共有オブジェクト libSampleLibSo.so をソース SampleLibSo.c からコンパイルする。
静的リンクする共有ライブラリ SampleLibA.a を SampleLibO1.o と SampleLibO2.o から、作成する。
gcc -shared -o "libSampleLibSo.so"  "SampleLibSo.c"
gcc -c -o "SampleLibO1.o"  "SampleLibO1.c"
gcc -c -o "SampleLibO2.o"  "SampleLibO2.c"
rm  "libSampleLibA.a"
ar -r  "libSampleLibA.a"  "SampleLibO1.o" "SampleLibO2.o"
出力ファイル名の先頭を lib 、かつ拡張子は so にしなければなりません。
gcc -o "SampleApp"  "SampleApp.c"  "SampleLibO.o"  -L. -lSampleLibSo -lSampleLibA
SampleApp アプリケーションを、SampleLibO.o と libSampleLibA.so と libSampleLibA.a から作成する。
-L オプションに、共有オブジェクトがあるフォルダーを指定する必要があります。
関連
ライブラリのシンボルを調べる
参考
出力ファイル名の先頭を lib 、かつ拡張子は a にしなければなりません。
gcc -c -o "SampleLibA.o"  "SampleLibA.c"
rm  "libSampleLibA.a"
ar -r  "libSampleLibA.a"  "SampleLibA.o" "SampleLibB.o" ...
複数のオブジェクト・ファイルをまとめたアーカイブを作成します。
ar -r
追加、または置き換えます。
ar -d
指定したオブジェクト・ファイルを削除します。
nm -C sample.a
nm -C -D sample.so
$ nm -C libFS.so
00002400 T FSCloseFont
00002478 T FSCloseServer
00011e3c d FSErrorList
00002b94 T FSFlush
サンプル
-C オプションは、C++言語のシンボルをデマングル(C++言語形式に)します。
-l オプションは、ソースファイルのパスと行番号を表示します。
-A オプションをつけると、出力の各行の行頭に、ファイル名が付きます。
-A オプション : ファイル名
$ nm -C -D -A libFS.so
libFS.so:00002400 T FSCloseFont
libFS.so:00002478 T FSCloseServer
libFS.so:00002b94 T FSFlush
ライブラリのシンボルを調べる
種類(シンボルの前の1文字)
A, a
大文字は extern 参照ができるもの。 小文字は、extern 参照ができないもの。
絶対的(Absolute)なシンボル
B, b
.bss セクション。 初期値が 0 の変数
.data セクション。 初期値が 0 以外の変数
D, d
T, t
.text セクション。 関数
U
未定義
関連
静的アーカイブの場合
共有オブジェクトの場合
nm -C -l sample.dbg | sort > sample.symbols.txt
objcopy --only-keep-debug によるデバッグ情報ファイルの場合
参考
size_t  strlcpy( char* Dst, char* Src, size_t Size );
size_t  strlcat( char* Dst, char* Src, size_t Size );
C++ std::string
SafeStr
strlcpy/strlcat
BSD流のライセンス
stdio.h が見つからない
「libc6-dev」 をインストールしてください。
cp: target `/tftpboot/' is not a directory: No such file or directory
できた実行ファイルを /tftpboot ディレクトリにコピーしようとしましたが、
ディレクトリが存在しないためにエラーになっています。
sudo mkdir /tftpboot
cp: cannot create regular file `/tftpboot/〜': Permission denied
コピー先へのアクセス権がスーパーユーザのみになっています。
sudo make
/bin/sh: mkimage: not found
が見つかりません。
u-boot を解凍し、uboot-1.2.0-arm1/tools/mkimage を
パスの通ったフォルダ(/usr/local/bin など)にコピーします。
付属の
関連
他のファイルは、
→ Git
→ CVS
Subversion
→ diff フロントエンド
→ patch-diff Tips (Web cache)
diff -u  old.txt  new.txt  > diff.txt
1つのファイルの比較:
フォルダの比較:
diff -u8prN  __old_folder__  __new_folder__  > a.diff
-u : unified 形式で出力(patchにも使える)
-b : 空白の違いを無視する
-B : 空行の違いを無視する
-i : 大文字小文字の違いを無視する
diff -q -r  __old_folder__  __new_folder__  > diff-path.txt
違うファイルのパスのみ出力
内容の違いを出力 (patchにも使える)
(-r オプション)
関連
テキストファイルの比較をします。
patch ツールで使える差分を生成します。
for Windows Package
参考
バイナリー・ファイルold/a.svgとnew/a.svgは違います
というエラーが出たら、手動でバイナリー・ファイルのパッチを用意してください。
バイナリー・ファイルは、patch がサポートしていません。参考:xdelta、bsdiff
関連
タイムスタンプのみ比較
#!/bin/bash -e
diff  "out.txt"  "ans.txt"  #// raise error, if not same
内容が同じなら終了コードは 0、異なるなら 1 になります。
text
number=1
number=2
number=3
number=4
number=5
text
number=1
number=3
number=6
number=5
number=7
3d2
< number=2
5c4
< number=4
---
> number=6
6a6
> number=7
--- a.txt
+++ b.txt
@@ -1,6 +1,6 @@
 text
 number=1
-number=2
 number=3
-number=4
+number=6
 number=5
+number=7
a.txt
b.txt
オプションなし
unified 形式(-u)
context 形式(-c)
*** a.txt
--- b.txt
***************
*** 1,6 ****
  text
  number=1
- number=2
  number=3
! number=4
  number=5
--- 1,6 ----
  text
  number=1
  number=3
! number=6
  number=5
+ number=7
#d# deleted
#c# changed
#a# added

# - line num

patch 不可能
両ファイルを
混ぜた表示

@@ -1,6 +1,6 @@ の部分は、
a.txt は 1行目から6行分
b.txt は 1行目から6行分

patch 可能
前後の行も表示
- deleted
! changed
+ added

*** 1,6*** は、
1行目〜6行目

patch 可能
diff の出力形式は、いくつか選べます。
以下にサンプルとして比較したファイルを示します。
出力結果を示します。
patch -p1  -d "TargetFolder" < diff.txt
head diff.txt
diff -u -r navi/CVS/Entries navi-bk/CVS/Entries
--- navi/CVS/Entries    2006-06-12 14:07:58.799394400 +0900
+++ navi-bk/CVS/Entries 2006-06-12 14:01:55.611398900 +0900
@@ -1,21 +1,6 @@
head の出力例
どこで patch するべきかを確認する(下記出力例を参照)
上記から、navi フォルダの親フォルダで patch することが分かる
diff コマンドで作成した差分をパッチとして、そのパッチを適用します。
patch コマンドは、行番号と差分情報を頼りに修正しています。
適用対象が1行でもずれていると、エラーになるか、正しい結果にはなりません。
-p オプションは、diff.txt に書かれているパスのうち、先頭からスキップするフォルダーの数を指定します。
スキップしないときでも -p0 が必要です。
-d オプションを省略したときは、カレント・フォルダーにパッチをあてます。
トラブル・シューティング
Hunk #n FAILED at nnn. n out of n hunks FAILED ? saving rejects to file file.rej
-p0 オプションか -p1 オプションを指定してください。
Segmentation fault
ポインタの値が正しくないときに、アクセスすると発生します。
やり直すを動くこともあります。
GNU 製コマンドライン・デバッガです。
をつけてコンパイル&リンクする必要があります。
$ gdb -e=sample.exe -s=sample.exe
(gdb) b FuncA
Breakpoint 1 at 0x401081: file sample.c, line 7.
(gdb) r
Breakpoint 1, main (argc=1, argv=0x4b2380) at sample.c:7
7   a ++;
(gdb) l
3  int  main( int argc, char* argv[] )
4  {
5    int  a = 0;
6
7    a++;
8    printf( "a = %d\n", a );
9
10   return  0;
11 }
(gdb) p a
$1 = 0
(gdb) n
8    printf( "a = %d\n", a );
(gdb) p a
$2 = 1
(gdb) c
Continuing.
a = 1

Program exited normally.
(gdb) q
b FuncA
r
l
p a
q
n
p a
gdb -e=sample.exe -s=sample.exe
c
… gdb 起動
… FuncA 関数にブレークポイントを張る
… プログラム開始
… 周辺ソースを表示
… 変数の値を表示
… 1行だけ実行(関数の中へ入るときは s )
… 変数の値を表示
… 次のプレークまで実行
… gdb から抜ける
ソースレベルデバッガの1つに、
があります。
以下は、コマンドラインで gdb を使ってデバッグする様子です。
bt
コールスタックを表示する
ステップイン
s
ソース中にブレークポイントを埋め込む
#include <signal.h> //[DEBUGGING]
raise(SIGTRAP); //[DEBUGGING]
info sharedlibrary
ロードされた共有ライブラリを一覧する
(ソース)
ブレークポイントを除く
clear (function_name)
参考
C++言語のメンバー関数にブレークポイントを張る
b  (class_name)::(member_function_name)
ソースを見る
l
または
bt
して表示されるファイル:行番号を
現在位置のソースを見る
l (file_name):(line_number)
l (file_name):(line_number)
n
ステップオーバー
fin
ステップアウト
info threads
スレッドを一覧する
別のスレッドのコールスタックを見る
thread 1
bt
… 1 は、info threads によるスレッド番号
変数の値を確認する
p (変数名)
set variable (式)
変数の値を修整する
… 変数 i の値を 1000 にする
set variable  i = 1000
p i
… 変数 i の値表示する
デバッグするプログラムは、
カーネル・モジュールはデバッグできません。
サンプル
スレッド
%./test
%ps
(PID を確認、例=1234)
%gdb
(gdb) attach 1234
コンソール1
コンソール2
コンソール1で、テストプログラムを実行しているときに、そのプログラムにデバッガを
接続して強制ブレークするには、コンソール2から、テストプログラムの PID を確認し、
gdb の attach コマンドを実行します。
%gdb
(中略)
(gdb) attach 3156
Attaching to process 4120

Load new symbol table from "/home/test.exe"? (y or n) y
Reading symbols from /home/test.exe...done.
Loaded symbols for ...
[Switching to thread 4120.0xe78]
(gdb)
sudo apt-get install ddd
インストール
をつけてコンパイル&リンクする必要があります。
の GUI 版デバッガーです。 内部で gdb を使っています。
デバッグするプログラムは、
起動
ddd  ./a.out
a.out プログラムをデバッグします。
X Window over ssh
が使えます。
行頭をダブルクリックすると、ブレークポイントを張ることができます。
$ insight sample.exe
デバッグする実行ファイルを指定して、insight を起動します。
(Run)
すると、 実行状態に変わり、main の先頭で止まります。
行頭をクリックするだけで、ブレークポイントを張ることができます。
変数にカーソルを合わせるだけで、変数の値を確認できます。
ローカル変数ウィンドウやウォッチウィンドウでは、構造体の展開などができます。
ウォッチウィンドウでは、式を入力することもできます。
(Continue)で(ブレークポイントまで)連続実行します。
Insight は、内部で gdb を使ったソース・デバッガです。
N(next) がうまくいかないことがあります、そのときは、ブレークポイント&C(continue) してください。
ソースファイル名を入れて Enter、Find に検索ワードか行番号を入れて Enter して探します。
-g オプションでコンパイルしていないと、ソースファイル名は表示されません。
apt-get 版はありません。 推奨