Linux編譯動態庫和gdb除錯命令
Linux編譯動態庫和gdb除錯命令TOC
IPC命令:
拷貝到當前目錄:
cp …/day01/cleanipc .
清除ipc命令:
cleanipc zhidao101 all
檢視網路連線:
netstat -an | grep 8001
檢視使用者程序:
ps -u zhidao101
執行資料夾壓縮命令:
tar zcvf dm_01.tar.gz dm_01/ 生成dm_01.tar.gz
如果從伺服器上傳下載tar.gz 使用二進位制方式
動態庫:
檢視檔案許可權:
ls -lt
檢視使用者空間動態庫、標頭檔案:
ls /usr/lib 動態庫檔案.so
ls /usr/local/lib
ls /usr/include
ls /usr/local/include
連結外部庫:
gcc -Wall a.c -o a.exe -lm 連結libm.so或者libm.a
檢視程式連結的庫:
ldd a.exe
把命令變成指令碼:
複製gcc -Wall a.c -o a.exe -lm 到mygcc檔案
修改檔案許可權:
chmod u+x mygcc
chmod 775 mygcc
靜態庫生成:
- touch myadd.h myadd.c
- vi myadd.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int myadd(int a,int b)
{
int c=0;c=a+b;return c;
} - vi myadd.h
extern int myadd(int a,int b); - vi mygcca
gcc -c myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o #ar是歸檔工具,rcs打包
chmod 775 mygcca - ./mygcca 生成libmyadd.a檔案
檢視檔案的屬性:
file libmyadd.a
檢視檔案的函式描述:
nm libmyadd.a
呼叫靜態庫:
- vi main.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int main(void)
{
printf(“myadd:%d\n”,myadd(3,4));
return 0;
} - gcc -L. main.c -o main.exe -lmyadd #-L指定靜態庫目錄
- ./main.exe
把命令變成指令碼:
複製gcc -L. main.c -o main.exe -lmyadd到mygcctest檔案
chmod 775 mygcctest
遞迴複製資料夾:
cp day02 day03 -r
移動所有標頭檔案到inc,所有原始檔到src
mv *.h ./inc
mv *.h ./src
gcc常用編譯選項:
-o 產生可執行檔案
-c 編譯原始碼
-E 預編譯
-S 產生彙編
-Wall 發出警告
-ldir dir加入標頭檔案搜尋路徑
-Ldir dir加入庫搜尋路徑
-llib 連結lib庫
-g 嵌入除錯資訊
從目錄編譯靜態庫:
vi mygcca
gcc -c -I./inc ./src/myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o
從目錄呼叫靜態庫:
- ls test==> mygcctest main.c libmyadd.a
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe - tail mygcctest
rm libmyadd.a #可執行程式生成之後就可以脫離靜態庫
動態庫生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜尋與路徑無關
檢視檔案的函式描述:
nm libmyadd.so | grep “myadd”
呼叫動態庫:
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe -lmyadd - ls libmyadd.so main.c mygcctest
- ./mygcctest
檢視程式連結的庫(動態庫和靜態庫):
ldd main.exe
檢視檔案屬性:
file main.exe
動態庫和靜態庫編譯的時候,可以把動態庫和靜態庫copy到gcc指令碼的目錄下
gcc能找到動態庫和靜態庫
動態庫配置路徑:
- 拷貝.so到系統共享庫目錄下/usr/lib
cp libmyadd.so $HOME/lib - vi .bash_profile
新增:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
export LD_LIBRARY_PATH - source .bash_profile
檢視環境變數:
env | grep LD*
終端用use+pwd登入伺服器,伺服器會為使用者執行一個shell
這個shell的配置檔案$(HOME)/.bash_profile
預設使用/bin/bash
檢視環境變數:
echo $PATH
echo $SHELL
檢視環境變數的設定:
env
修改shell執行的配置檔案,我們需要重新執行配置檔案
source .bash_profile
任何目錄下執行cd命令 都會轉到$HOME
socket專案編譯動態庫:
ls mysocket_so_test
bin etc inc lib log makefile mysocketexe src test
ls inc
itcast_comm.h itcastlog.h socketclientadd.h
ls src
demo01_tesplatfrom.c ticastlog.c socketclient.c
vi makefile
WORKDIR=.
VPATH = ./src
LIBOBJS= socketclient.o itcastlog.o
OBJS= demo01_testplatform.o
LIB1 = libmysocket.so
EXE1 = mysocketexe
CC = gcc
CFLGS= -Wall -g -I$(WORKDIR)/inc/
LIBFLAG = -L$(HOME)/lib
all: $(LIB1) $(EXE1)
(LIBOBJS)
$(CC) -shared -fPIC $^ -o [email protected]
cp $(LIB1) $(HOME)/lib
mv $(LIB1) ./lib
(OBJS)
$(CC) $^ $(LIBFLAG) -lmysocket -o [email protected]
.c.o:
$(CC) $(CFLGS) -c $< -o [email protected] -shared -fPIC
clean:
rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)
檢視程式的記憶體大小:
size mysocketexe
檢視程式的函式描述:
strings mysocketexe
gdb除錯選項:
r 執行
l 列出原始碼
b 設定斷點
ib 檢視斷點資訊
c 繼續執行至下一個斷點
watch 設定觀察點
s 單步跟蹤,進入函式
n 單步跟蹤,不進入函式
finish 執行函式,直到返回
u 退出迴圈
除錯程式:
gdb mysocketexe
b main
b 20
info break
run
n
s
print handle #型別 地址
finish
quit
查詢除錯檔案core
ls -lt | grep “core”
設定檔案大小限制:
ulimit -c 3000
開啟除錯資訊:
gdb dem01 core.13973
工程專案方法,組織src和inc編譯動態庫和靜態庫:
1.c 2.c 3.c ====>src
1.h 2.h 3.h >inc
libsocket.so>lib
IPC命令:
拷貝到當前目錄:
cp …/day01/cleanipc .
清除ipc命令:
cleanipc zhidao101 all
檢視網路連線:
netstat -an | grep 8001
檢視使用者程序:
ps -u zhidao101
執行資料夾壓縮命令:
tar zcvf dm_01.tar.gz dm_01/ 生成dm_01.tar.gz
如果從伺服器上傳下載tar.gz 使用二進位制方式
動態庫:
檢視檔案許可權:
ls -lt
檢視使用者空間動態庫、標頭檔案:
ls /usr/lib 動態庫檔案.so
ls /usr/local/lib
ls /usr/include
ls /usr/local/include
連結外部庫:
gcc -Wall a.c -o a.exe -lm 連結libm.so或者libm.a
檢視程式連結的庫:
ldd a.exe
把命令變成指令碼:
複製gcc -Wall a.c -o a.exe -lm 到mygcc檔案
修改檔案許可權:
chmod u+x mygcc
chmod 775 mygcc
靜態庫生成:
- touch myadd.h myadd.c
- vi myadd.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int myadd(int a,int b)
{
int c=0;c=a+b;return c;
} - vi myadd.h
extern int myadd(int a,int b); - vi mygcca
gcc -c myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o #ar是歸檔工具,rcs打包
chmod 775 mygcca - ./mygcca 生成libmyadd.a檔案
檢視檔案的屬性:
file libmyadd.a
檢視檔案的函式描述:
nm libmyadd.a
呼叫靜態庫:
- vi main.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int main(void)
{
printf(“myadd:%d\n”,myadd(3,4));
return 0;
} - gcc -L. main.c -o main.exe -lmyadd #-L指定靜態庫目錄
- ./main.exe
把命令變成指令碼:
複製gcc -L. main.c -o main.exe -lmyadd到mygcctest檔案
chmod 775 mygcctest
遞迴複製資料夾:
cp day02 day03 -r
移動所有標頭檔案到inc,所有原始檔到src
mv *.h ./inc
mv *.h ./src
gcc常用編譯選項:
-o 產生可執行檔案
-c 編譯原始碼
-E 預編譯
-S 產生彙編
-Wall 發出警告
-ldir dir加入標頭檔案搜尋路徑
-Ldir dir加入庫搜尋路徑
-llib 連結lib庫
-g 嵌入除錯資訊
從目錄編譯靜態庫:
vi mygcca
gcc -c -I./inc ./src/myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o
從目錄呼叫靜態庫:
- ls test==> mygcctest main.c libmyadd.a
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe - tail mygcctest
rm libmyadd.a #可執行程式生成之後就可以脫離靜態庫
動態庫生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜尋與路徑無關
檢視檔案的函式描述:
nm libmyadd.so | grep “myadd”
呼叫動態庫:
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe -lmyadd - ls libmyadd.so main.c mygcctest
- ./mygcctest
檢視程式連結的庫(動態庫和靜態庫):
ldd main.exe
檢視檔案屬性:
file main.exe
動態庫和靜態庫編譯的時候,可以把動態庫和靜態庫copy到gcc指令碼的目錄下
gcc能找到動態庫和靜態庫
動態庫配置路徑:
- 拷貝.so到系統共享庫目錄下/usr/lib
cp libmyadd.so $HOME/lib - vi .bash_profile
新增:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
export LD_LIBRARY_PATH - source .bash_profile
檢視環境變數:
env | grep LD*
終端用use+pwd登入伺服器,伺服器會為使用者執行一個shell
這個shell的配置檔案$(HOME)/.bash_profile
預設使用/bin/bash
檢視環境變數:
echo $PATH
echo $SHELL
檢視環境變數的設定:
env
修改shell執行的配置檔案,我們需要重新執行配置檔案
source .bash_profile
任何目錄下執行cd命令 都會轉到$HOME
socket專案編譯動態庫:
ls mysocket_so_test
bin etc inc lib log makefile mysocketexe src test
ls inc
itcast_comm.h itcastlog.h socketclientadd.h
ls src
demo01_tesplatfrom.c ticastlog.c socketclient.c
vi makefile
WORKDIR=.
VPATH = ./src
LIBOBJS= socketclient.o itcastlog.o
OBJS= demo01_testplatform.o
LIB1 = libmysocket.so
EXE1 = mysocketexe
CC = gcc
CFLGS= -Wall -g -I$(WORKDIR)/inc/
LIBFLAG = -L$(HOME)/lib
all: $(LIB1) $(EXE1)
(LIBOBJS)
$(CC) -shared -fPIC $^ -o [email protected]
cp $(LIB1) $(HOME)/lib
mv $(LIB1) ./lib
(OBJS)
$(CC) $^ $(LIBFLAG) -lmysocket -o [email protected]
.c.o:
$(CC) $(CFLGS) -c $< -o [email protected] -shared -fPIC
clean:
rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)
檢視程式的記憶體大小:
size mysocketexe
檢視程式的函式描述:
strings mysocketexe
gdb除錯選項:
r 執行
l 列出原始碼
b 設定斷點
ib 檢視斷點資訊
c 繼續執行至下一個斷點
watch 設定觀察點
s 單步跟蹤,進入函式
n 單步跟蹤,不進入函式
finish 執行函式,直到返回
u 退出迴圈
除錯程式:
gdb mysocketexe
b main
b 20
info break
run
n
s
print handle #型別 地址
finish
quit
查詢除錯檔案core
ls -lt | grep “core”
設定檔案大小限制:
ulimit -c 3000
開啟除錯資訊:
gdb dem01 core.13973
工程專案方法,組織src和inc編譯動態庫和靜態庫:
1.c 2.c 3.c ====>src
1.h 2.h 3.h >inc
libsocket.so>lib