摘要: Linux tcpdump命令詳解簡介用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的信息... 閱讀全文
TODO原因
TODO
同事需要在suse上安裝php的性能測試工具xhprof,圖形化展示需要源碼安裝graphviz
選取的源碼為graphviz-2.24.0.tar.gz,
安裝步驟如下
1.tar xzvf graphviz-2.24.0.tar.gz
2.cd graphviz-2.24.0
3../configure
4.make
報了如下錯誤
選取的源碼為graphviz-2.24.0.tar.gz,
安裝步驟如下
1.tar xzvf graphviz-2.24.0.tar.gz
2.cd graphviz-2.24.0
3../configure
4.make
報了如下錯誤
gcc -DHAVE_CONFIG_H -I. -I../.. -I../.. -I../../lib/common -I../../lib/gvc -I../../lib/pack -I../../lib/ortho -I../../lib/pathplan -I../../lib/graph -I../../lib/sparse -I../../lib/rbtree -I../../lib/sfdpgen -I../../lib/cdt -I/usr/local/include -g -O2 -Wno-unknown-pragmas -Wstrict-prototypes -Wpointer-arith -Wall -ffast-math -MT multispline.lo -MD -MP -MF .deps/multispline.Tpo -c multispline.c -fPIC -DPIC -o .libs/multispline.o
multispline.c:1228: error: expected specifier-qualifier-list before 'PQ'
使用如下命令find . -name multispline.c ,結果為
In file included from multispline.c:1224:
../../lib/ortho/fPQ.h:22:1: warning: this is the location of the previous definition
multispline.c:1234:1: warning: "N_IDX" redefined
../../lib/ortho/fPQ.h:23:1: warning: this is the location of the previous definition
查找multispline.c,使用如下命令find . -name multispline.c ,結果為
./lib/neatogen/multispline.c
發現PQ定義在fPQ.h,當前路徑下有fPQ.h還是無法編譯
cd graphviz-2.24.0
find . -name "fPQ.h
./lib/neatogen/fPQ.h
./lib/ortho/fPQ.h
可能是文件不同或是被包含兩次,具體沒查cd lib/ortho/
mkdir -p bak
mv * bak
然后cd ../neatogen/
單獨編譯neatogen運行make
成功
cd ../ortho
mv bak/*.
mkdir -p bak
mv * bak
然后cd ../neatogen/
單獨編譯neatogen運行make
成功
cd ../ortho
mv bak/*.
cd ../../
運行make,所有模塊都可以編譯了
運行make,所有模塊都可以編譯了
ACE讀取ini配置,需要使用兩個類,ACE_Configuration_Heap和ACE_Ini_ImpEXP
然后調用 get_string_value,好像 get_integer_value不好用
然后調用 get_string_value,好像 get_integer_value不好用
參考文章http://blog.csdn.net/russell_tao/article/details/7207093
嘗試過在centos6.0上編譯不成功
需要安裝的第三方軟件如下
2.tar xzvf kfs-0.5.tar.gz
3.cd kfs-0.5
4.mkdir build
5.cd build
6.cmake ..
7.make
8.make install
后面參考文章
嘗試過在centos6.0上編譯不成功
需要安裝的第三方軟件如下
openssl
openssl-devel
xfsprogs
xfsprogs-devel
e2fsprogs
e2fsprogs-devel
log4cpp
boost
boost-devel
安裝jkd,我安裝在/usr/lib/jvm/jdk1.7.0_04
1.wget http://kosmosfs.googlecode.com/files/kfs-0.5.tar.gz
2.tar xzvf kfs-0.5.tar.gz
3.cd kfs-0.5
4.mkdir build
5.cd build
6.cmake ..
7.make
8.make install
后面參考文章
strace a.out用來查看a.out程序運行中有哪些系統調用
ltrace a.out用來查看a.out運行中有哪些庫函數調用 創建和使用靜態庫
創建一個靜態庫是相當簡單的。通常使用 ar 程序把一些目標文件(.o)組合在一起,
成為一個單獨的庫,然后運行 ranlib,以給庫加入一些索引信息。
2 創建和使用共享庫
特殊的編譯和連接選項
-D_REENTRANT 使得預處理器符號 _REENTRANT 被定義,這個符號激活一些宏特性。
-fPIC 選項產生位置獨立的代碼。由于庫是在運行的時候被調入,因此這個
選項是必需的,因為在編譯的時候,裝入內存的地址還不知道。如果
不使用這個選項,庫文件可能不會正確運行。
-shared 選項告訴編譯器產生共享庫代碼。
-Wl,-soname -Wl 告訴編譯器將后面的參數傳遞到連接器。而 -soname 指定了
共享庫的 soname。
# 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,并以
root 身份運行 ldconfig;或者
# 運行 export LD_LIBRARY_PATH='pwd',它把當前路徑加到庫搜索路徑中去。
3 使用高級共享庫特性
1> ldd 工具
ldd 用來顯示執行文件需要哪些共享庫, 共享庫裝載管理器在哪里找到了需要的共享庫.
2> soname
共享庫的一個非常重要的,也是非常難的概念是 soname--簡寫共享目標名(short for shared object name)。這是一個為共享庫(.so)文件而內嵌在控制數據中的名字。如前面提到的,每一個程序都有一個需要使用的庫的清單。這個清單的內容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個清單。
soname 的關鍵功能是它提供了兼容性的標準。當要升級系統中的一個庫時,并且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運行。這個特性使得在 Linux 下,升級使用共享庫的程序和定位錯誤變得十分容易。
在 Linux 中,應用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。
查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關系
3> 共享庫裝載器
當程序被調用的時候,Linux 共享庫裝載器(也被稱為動態連接器)也自動被調用。它的作用是保證程序所需要的所有適當版本的庫都被調入內存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決于 Linux libc 的版本,它必須使用一點外部交互,才能完成自己的工作。然而它接受在環境變量和配置文件中的配置信息。
文件 /etc/ld.so.conf 定義了標準系統庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個設置,必須以 root 身份運行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個文件其實是裝載器內部使用的文件之一。
可以使用許多環境變量控制共享庫裝載器的操作(表1-4+)。
表 1-4+ 共享庫裝載器環境變量
變量 含義
LD_AOUT_LIBRARY_PATH 除了不使用 a.out 二進制格式外,與 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD 除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。
LD_KEEPDIR 只適用于 a.out 庫;忽略由它們指定的目錄。
LD_LIBRARY_PATH 將其他目錄加入庫搜索路徑。它的內容應該是由冒號
分隔的目錄列表,與可執行文件的 PATH 變量具有相同的格式。
如果調用設置用戶 ID 或者進程 ID 的程序,該變量被忽略。
LD_NOWARN 只適用于 a.out 庫;當改變版本號是,發出警告信息。
LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標準庫。
使用空格分開多個入口。對于設置用戶 ID 或者進程 ID 的程序,
只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
了全局版本號,該文件不遵守這個限制。
4> 使用 dlopen
另外一個強大的庫函數是 dlopen()。該函數將打開一個新庫,并把它裝入內存。該函數主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 服務器利用這個函數在運行過程中加載模塊,這為它提供了額外的能力。一個配置文件控制了加載模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。
可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫中實現。它需要兩個參數:一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫可以獲得其中的符號。
當庫被裝入后,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,并且調用裝載庫中的相應函數。 作者:perfectpdl 發表于2011-12-25 21:40:34 原文鏈接
ltrace a.out用來查看a.out運行中有哪些庫函數調用 創建和使用靜態庫
創建一個靜態庫是相當簡單的。通常使用 ar 程序把一些目標文件(.o)組合在一起,
成為一個單獨的庫,然后運行 ranlib,以給庫加入一些索引信息。
2 創建和使用共享庫
特殊的編譯和連接選項
-D_REENTRANT 使得預處理器符號 _REENTRANT 被定義,這個符號激活一些宏特性。
-fPIC 選項產生位置獨立的代碼。由于庫是在運行的時候被調入,因此這個
選項是必需的,因為在編譯的時候,裝入內存的地址還不知道。如果
不使用這個選項,庫文件可能不會正確運行。
-shared 選項告訴編譯器產生共享庫代碼。
-Wl,-soname -Wl 告訴編譯器將后面的參數傳遞到連接器。而 -soname 指定了
共享庫的 soname。
# 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,并以
root 身份運行 ldconfig;或者
# 運行 export LD_LIBRARY_PATH='pwd',它把當前路徑加到庫搜索路徑中去。
3 使用高級共享庫特性
1> ldd 工具
ldd 用來顯示執行文件需要哪些共享庫, 共享庫裝載管理器在哪里找到了需要的共享庫.
2> soname
共享庫的一個非常重要的,也是非常難的概念是 soname--簡寫共享目標名(short for shared object name)。這是一個為共享庫(.so)文件而內嵌在控制數據中的名字。如前面提到的,每一個程序都有一個需要使用的庫的清單。這個清單的內容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個清單。
soname 的關鍵功能是它提供了兼容性的標準。當要升級系統中的一個庫時,并且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運行。這個特性使得在 Linux 下,升級使用共享庫的程序和定位錯誤變得十分容易。
在 Linux 中,應用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。
查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關系
3> 共享庫裝載器
當程序被調用的時候,Linux 共享庫裝載器(也被稱為動態連接器)也自動被調用。它的作用是保證程序所需要的所有適當版本的庫都被調入內存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決于 Linux libc 的版本,它必須使用一點外部交互,才能完成自己的工作。然而它接受在環境變量和配置文件中的配置信息。
文件 /etc/ld.so.conf 定義了標準系統庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個設置,必須以 root 身份運行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個文件其實是裝載器內部使用的文件之一。
可以使用許多環境變量控制共享庫裝載器的操作(表1-4+)。
表 1-4+ 共享庫裝載器環境變量
變量 含義
LD_AOUT_LIBRARY_PATH 除了不使用 a.out 二進制格式外,與 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD 除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。
LD_KEEPDIR 只適用于 a.out 庫;忽略由它們指定的目錄。
LD_LIBRARY_PATH 將其他目錄加入庫搜索路徑。它的內容應該是由冒號
分隔的目錄列表,與可執行文件的 PATH 變量具有相同的格式。
如果調用設置用戶 ID 或者進程 ID 的程序,該變量被忽略。
LD_NOWARN 只適用于 a.out 庫;當改變版本號是,發出警告信息。
LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標準庫。
使用空格分開多個入口。對于設置用戶 ID 或者進程 ID 的程序,
只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
了全局版本號,該文件不遵守這個限制。
4> 使用 dlopen
另外一個強大的庫函數是 dlopen()。該函數將打開一個新庫,并把它裝入內存。該函數主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 服務器利用這個函數在運行過程中加載模塊,這為它提供了額外的能力。一個配置文件控制了加載模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。
可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫中實現。它需要兩個參數:一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫可以獲得其中的符號。
當庫被裝入后,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,并且調用裝載庫中的相應函數。 作者:perfectpdl 發表于2011-12-25 21:40:34 原文鏈接
| 系統調用(system call)是操作系統內核提供的函數,在內核態運行(kernel mode),屬于函數中的低等下人,終身代號9527,雖然低等,但是誰也離不開他們,因為離開他們就沒辦法和內核打交道了,沒辦法和內核打交道就什么都歇菜了。。。 linux3.0.0-14的系統調用有346個,可以在源碼的 linux-3.0/arch/x86/kernel/syscall_table_32.S文件中找到所有的系統調用編號,如果以匯編的方法調用這些系統函數,那么放在EAX寄存器里面的值就是想要調用的函數的號碼,把前20個貼在下面了,很多貌似很熟悉的吧:)ENTRY(sys_call_table) .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ .long sys_exit .long ptregs_fork .long sys_read .long sys_write .long sys_open /* 5 */ .long sys_close .long sys_waitpid .long sys_creat .long sys_link .long sys_unlink /* 10 */ .long ptregs_execve .long sys_chdir .long sys_time .long sys_mknod .long sys_chmod /* 15 */ .long sys_lchown16 .long sys_ni_syscall /* old break syscall holder */ .long sys_stat .long sys_lseek .long sys_getpid /* 20 */ 庫函數是在系統調用上的一層包裝,運行在用戶態(user mode),打個比方吧,庫函數相當于包工頭,系統調用是工人,我們可以自己找工人分任務,但一般是把任務攤給包工頭,包工頭再去給工人分任務。 所以雖然最終所有的工作都是系統調用做的,但是我們更通常的做法是調用庫函數,有以下幾個原因:
|


