Ⅰ 如何得到動態鏈接庫的輸出函數tmp命令
需要查看一個動態鏈接庫的輸出函數列表,有很多軟體可以滿足此要求,比如說 exeScope。不過,去下載一個軟體總歸是很麻煩,Delphi 本身就自帶一個類似的工具,那就是 tmp.exe,Delphi 的所有版本都有,是一個命令行程序,在 Delphi 安裝目錄的 Bin 目錄下。
用法:
tmp.exe D:/example.dll
以上命令將在控制台輸出該 DLL 導出的函數列表;也可以將控制台的輸出信息保存到一個文件,使用以下命令格式:
tmp.exe D:/Example.dll >D:/out.txt
Ⅱ linux命令如何創建庫鏈接
ln -s 目標庫 創建的鏈接名,常規路徑下可能還需要sudo
Ⅲ windows中如何注冊動態鏈接庫文件
Rundll者,顧名思義,
運行Dll也,它的功能就是以命令行的方式調用Windows的動態鏈接庫,
Rundll32.exe與Rundll.exe的區別就在於前者是調用32位的鏈接庫,而後者是運
用於16位的鏈接庫,它們的命令格式是:RUNDLL.EXE
,<入口點,<調用參數如:顯示「控制面板-添加/刪除程序-安裝/卸載」 面板。
命令行: rundll32.exe shell32.dll,Control_RunDLL
appwiz.cpl,,2
這里要注意三點:
1.Dll文件名中不能含有空格
,比如該文件位於
c:\Program Files\目錄,你要把這個路徑改成c:\Progra~1\;
2.Dll文件名與Dll
入口點間的逗號不能少
,否則程序將出錯並且不會給出任何信息!3.這是最重要的一點:Rundll不能用來調用含返回值參數的Dll
,例如Win32API中的GetUserName(),
GetTextFace()等。在Visual Basic中,提供了一條執行外部程序的指令Shell,格式為:Shell「命令行」如果能配合Rundll32.exe用好Shell指令,會使您的VB程序擁有用其他方法難
以甚至無法實現的效果:仍以重啟為例,傳統的方法需要你在VB工程中先建立一
個模慷衷謚恍枰瘓:
Ⅳ matlab在linux下生成的動態鏈接庫怎麼用
動態庫的生成
1>首先生成目標文件,但是此時要加編譯器選項-fpic和鏈接器選項-shared,
gcc -fpic -c add.c
gcc -fpic -c sub.c
生成中間文件add.o和sub.o
2>其次生成動態庫
gcc -shared –o libtiger.so add.o sub.o
生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程序生成可執行程序
說明:
以上兩部也可以合成一步搞定:
gcc -fpic -shared add.c sub.c -o libtiger.so
2.使用動態鏈接庫
在編譯程序時,使用動態鏈接庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行文件的時候會鏈接庫文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定動態鏈接庫的路勁,-ldtiger鏈接庫函數tiger。-ltiger是動態庫的調用規則。Linux系統下的動態庫命名方式是lib*.so,而在鏈接時表示位-l*,*是自己命名的庫名。
3>但是程序會提示如下錯誤
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
這是因為程序運行時沒有找到動態鏈接庫造成的。程序編譯時鏈接動態庫和運行時使用動態鏈接庫的概念是不同的,在運行時,程序鏈接的動態鏈接庫需要在系統目錄下才行。
4>使用以下方法可以解決此問題
a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄 /lib 下(但是,要是超級用戶才可以,因此要使用sudo哦,親)。就可以生成可執行程序了
b.第二種方法是:將動態鏈接庫的目錄放到程序搜索路徑中,可以將庫的路徑加到環境變數LD_LIBRARY_PATH中實現:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
Ⅳ 如何用gcc編譯生成動態鏈接庫*.so文件
生成動態鏈接庫的命令行為:
gcc -fPIC -shared -o libstr.so
當將main.c和動態鏈接庫進行連接生成可執行文件 的命令如下:
gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr
測試是否動態鏈接,如果列出libstr.so, 那麼應該是連接正常了ldd main註:1)-L.:表示連接的庫在當前的目錄中。
Ⅵ matlab怎麼生成動態鏈接庫
1>首先生成目標文件,但是此時要加編譯器選項-fpic和鏈接器選項-shared,
gcc -fpic -c add.c
gcc -fpic -c sub.c
生成中間文件add.o和sub.o
2>其次生成動態庫
gcc -shared –o libtiger.so add.o sub.o
生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程序生成可執行程序
說明:
以上兩部也可以合成一步搞定:
gcc -fpic -shared add.c sub.c -o libtiger.so
2.使用動態鏈接庫
在編譯程序時,使用動態鏈接庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行文件的時候會鏈接庫文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定動態鏈接庫的路勁,-ldtiger鏈接庫函數tiger。-ltiger是動態庫的調用規則。Linux系統下的動態庫命名方式是lib*.so,而在鏈接時表示位-l*,*是自己命名的庫名。
3>但是程序會提示如下錯誤
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
Ⅶ 什麼是靜態鏈接庫什麼是動態鏈接庫他們有什麼區別
一、動態鏈接庫的概念
動態鏈接庫(Dynamic Link Library,縮寫為DLL)是一個可以被其它應用程序共享的程序模塊,其中封裝了一些可以被共享的常式和資源。動態鏈接庫文件的擴展名一般是dll,也有可能是drv、sys和fon,它和可執行文件(exe)非常類似,區別在於DLL中雖然包含了可執行代碼卻不能單獨執行,而應由Windows應用程序直接或間接調用。
動態鏈接是相對於靜態鏈接而言的。所謂靜態鏈接是指把要調用的函數或者過程鏈接到可執行文件中,成為可執行文件的一部分。換句話說,函數和過程的代碼就在程序的exe文件中,該文件包含了運行時所需的全部代碼。當多個程序都調用相同函數時,內存中就會存在這個函數的多個拷貝,這樣就浪費了寶貴的內存資源。而動態鏈接所調用的函數代碼並沒有被拷貝到應用程序的可執行文件中去,而是僅僅在其中加入了所調用函數的描述信息(往往是一些重定位信息)。僅當應用程序被裝入內存開始運行時,在Windows的管理下,才在應用程序與相應的DLL之間建立鏈接關系。當要執行所調用DLL中的函數時,根據鏈接產生的重定位信息,Windows才轉去執行DLL中相應的函數代碼。
一般情況下,如果一個應用程序使用了動態鏈接庫,Win32系統保證內存中只有DLL的一份復製品,這是通過內存映射文件實現的。DLL首先被調入Win32系統的全局堆棧,然後映射到調用這個DLL的進程地址空間。在Win32系統中,每個進程擁有自己的32位線性地址空間,如果一個DLL被多個進程調用,每個進程都會收到該DLL的一份映像。
Ⅷ 如何在 Linux 下調試動態鏈接庫
大家都知道在 Linux 可以用 gdb 來調試應用程序,當然前提是用 gcc 編譯程序時要加上
-g 參數。
我這篇文章里將討論一下用 gdb 來調試動態鏈接庫的問題。
首先,假設我們准備這樣的一個動態鏈接庫:
QUOTE:
庫名稱是: ggg
動態鏈接庫文件名是: libggg.so
頭文件是: get.h
提供這樣兩個函數調用介面:
int get ();
int set (int a);
要生成這樣一個動態鏈接庫,我們首先編寫這樣一個頭文件:
[Copy to clipboard]
CODE:
/************關於本文檔********************************************
*filename: get.h
*purpose: 一個動態鏈接庫頭文件示例
*tided by: zhoulifa() 周立發 ()
Linux 愛好者 Linux 知識傳播者 SOHO 族 開發者 最擅長 C 語言
*date time: 2006-11-15 21:11:54
*Note: 任何人可以任意復制代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循 GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*感謝 提供原始代碼,
我在他的基礎上整理了此文
*********************************************************************/
int get ();
int set (int a);
然後准備這樣一個生成動態鏈接庫的源文件:
[Copy to clipboard]
CODE:
/************關於本文檔********************************************
*filename: get.cpp
*purpose: 一個動態鏈接庫源文件示例
*tided by: zhoulifa() 周立發 ()
Linux 愛好者 Linux 知識傳播者 SOHO 族 開發者 最擅長 C 語言
*date time:2006-11-15 21:11:54
*Note: 任何人可以任意復制代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循 GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*感謝 提供原始代碼,
我在他的基礎上整理了此文
*********************************************************************/
#include <stdio.h>
#include "get.h"
static int x=0;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n", a);
x = a;
return x;
}
然後我們用 GNU 的 C/C++ 編譯器來生成動態鏈接庫,編譯命令如下:
QUOTE:
g++ get.cpp -shared -g -DDEBUG -o
libggg.so
這樣我們就准備好了動態鏈接庫了,下面我們編寫一個應用程序來調用此動態鏈接庫,源代碼如下:
[Copy to clipboard]
CODE:
/************關於本文檔********************************************
*filename: pk.cpp
*purpose: 一個調用動態鏈接庫的示例
*tided by: zhoulifa() 周立發 ()
Linux 愛好者 Linux 知識傳播者 SOHO 族 開發者 最擅長 C 語言
*date time:2006-11-15 21:11:54
*Note: 任何人可以任意復制代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循 GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*感謝 提供原始代碼,
我在他的基礎上整理了此文
*********************************************************************/
#include <stdio.h>
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
return 0;
}
編譯此程序用下列命令,如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,就用下面這條命令:
QUOTE:
g++ pk.cpp -o app -Wall -g -lggg
否則就用下面這條命令:
QUOTE:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`
下面我們就開始調試上面命令生成的 app 程序吧。如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib或 /usr/lib 之類的,調試就順利完成,如下
:
QUOTE:
./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation,Inc.
GDB is free software, covered by the GNU
General Public License, and you are
welcome to change it and/or distribute
copies of it under certain conditions.
Type "show ing" to see theconditions.
There is absolutely no warranty for GDB.
Type "show warranty" for details.This GDB was configured as "i486-linux-
gnu"...Using host libthread_db library"/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main /* 這是在程序的 main 處設置斷點 */
Breakpoint 1 at 0x804853c: file pk.cpp,line 7.
(gdb) b set /* 這是在程序的 set 處設置斷點 */
Function "set" not defined.
Make breakpoint pending on future shared
library load? (y or [n]) y /* 這里必須選擇 y 調試程序才會跟蹤到動態鏈接庫內部去
*/Breakpoint 2 (set) pending.
(gdb) run /* 開始運行我們的程序,直到遇見斷點時暫停 */
Starting program: /data/example/c/app
Breakpoint 3 at 0xb7f665f8: file get.cpp,line 11.
Pending breakpoint "set" resolved
Breakpoint 1, main (argc=1,argv=0xbf990504) at pk.cpp:7
7 int a = 100;
(gdb) n /* 繼續執行程序的下一行代碼
*/
8 int b = get ();
(gdb) n /* 程序執行到了我們斷點所在的動態鏈接庫了 */
get x=0
9 int c = set (a);(gdb) n
Breakpoint 3, set (a=100) at get.cpp:11
11 printf ("set a=%d\n", a);
(gdb) list /* 查看當前代碼行周圍的代碼,證明我們已經跟蹤到動態鏈接庫的源代碼裡面了 */
6 printf ("get x=%d\n", x);
7 return x;
8 }
9 int set (int a)
10 {
11 printf ("set a=%d\n", a);
12 x = a;
13 return x;
14 }
(gdb) n
set a=100
12 x = a;(gdb) n
13 return x;(gdb) n
14 }
(gdb) n
main (argc=1, argv=0xbf990504) at
pk.cpp:10
10 int d = get ();
(gdb) n
get x=100
11 printf ("a=%d,b=%d,c=%
d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100,d=100
12 return 0;
(gdb) c
Continuing.
Program exited normally.
(gdb) quit /* 程序順利執行結束 */#
如果我們沒有把動態鏈接庫放到指定目錄,比如/lib裡面,調試就會失敗,過程如下:
QUOTE:
# gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation,
Inc.
GDB is free software, covered by the GNU
General Public License, and you arewelcome to change it and/or distribute
copies of it under certain conditions.
Type "show ing" to see theconditions.
There is absolutely no warranty for GDB.
Type "show warranty" for details.
This GDB was configured as "i486-linux-
gnu"...Using host libthread_db library
"/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x804853c: file pk.cpp,
line 7.
(gdb) b set
Function "set" not defined.
Make breakpoint pending on future shared
library load? (y or [n]) y
Breakpoint 2 (set) pending.
(gdb) run /* 雖然調試操作都一樣,但程序執行失敗 */
Starting program: /data/example/c/app
/data/example/c/app: error while loading
shared libraries: libggg.so: cannot open
shared object file: No such file or
directory
Program exited with code 0177.
(gdb) quit
#
本次實驗的環境是:
CPU:AMD Athlon(tm) 64 Processor 3000+
內存:512M
OS:Ubuntu GNU/Linux 6.06 dapper LTS
gcc:gcc 版本 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
break(b) 行號:在某一行設置斷點
break 函數名:在某個函數開頭設置斷點
break...if...:設置條件斷點
continue(或c):從當前位置開始連續而非單步執行程序
delete breakpoints:刪除所有斷點
delete breakpoints n:刪除序號為n的斷點
disable breakpoints:禁用斷點
enable breakpoints:啟用斷點
info(或i) breakpoints:參看當前設置了哪些斷點
run(或r):從開始連續而非單步執行程序
display 變數名:跟蹤查看一個變數,每次停下來都顯示它的值
undisplay:取消對先前設置的那些變數的跟蹤
Ⅸ win7環境下怎麼用cmd命令查看動態鏈接庫的內容
雙網卡之間互相訪問原理其實很簡單,互相設置對方的IP為自己的這張網卡的網關就足夠了。為了讓機器重啟動後依然有效,在使用route 命令添加路由的時候加上 -p 就可以了。 Route 在本地 IP 路由表中顯示和修改條目。使用不帶參數的 route 可以顯示幫助。 語法 route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric]] [if Interface]] 參數 -f 清除所有不是主路由(網掩碼為 255.255.255.255 的路由)、環回網路路由(目標為 127.0.0.0,網掩碼為 255.255.255.0 的路由)或多播路由(目標為 224.0.0.0,網掩碼為 240.0.0.0 的路由)的條目的路由表。如果它與命令之一(例如 add、change 或 delete)結合使用,表會在運行命令之前清除。 -p 與 add 命令共同使用時,指定路由被添加到注冊表並在啟動 TCP/IP 協議的時候初始化 IP 路由表。默認情況下,啟動 TCP/IP 協議時不會保存添加的路由。與 print 命令一起使用時,則顯示永久路由列表。所有其他的命令都忽略此參數。永久路由存儲在注冊表中的位置是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes。 Command 指定要運行的命令。下表列出了有效的命令。 命令 意圖 add 添加路由。 change 更改現存路由。 delete 刪除路由。 print 列印路由。 Destination 指定路由的網路目標地址。目標地址可以是一個 IP 網路地址(其中網路地址的主機地址位設置為 0),對於主機路由是 IP 地址,對於默認路由是 0.0.0.0。 mask Netmask 指定與網路目標地址相關聯的網掩碼(又稱之為子網掩碼)。子網掩碼對於 IP 網路地址可以是一適當的子網掩碼,對於主機路由是 255.255.255.255,對於默認路由是 0.0.0.0。如果忽略,則使用子網掩碼 255.255.255.255。定義路由時由於目標地址和子網掩碼之間的關系,目標地址不能比它對應的子網掩碼更為詳細。換句話說,如果子網掩碼的一位是 0,則目標地址中的對應位就不能設置為 1。 Gateway 指定超過由網路目標和子網掩碼定義的可達到的地址集的前一個或下一個躍點 IP 地址。對於本地連接的子網路由,網關地址是分配給連接子網介面的 IP 地址。對於要經過一個或多個路由器才可用到的遠程路由,網關地址是一個分配給相鄰路由器的、可直接達到的 IP 地址。 metric Metric 為路由指定所需躍點數的整數值(范圍是 1 - 9999),它用來在路由表裡的多個路由中選擇與轉發包中的目標地址最為匹配的路由。所選的路由具有最少的躍點數。躍點數能夠反映躍點的數量、路徑的速度、路徑可靠性、路徑吞吐量以及管理屬性。 if Interface 指定目標可以到達的介面的介面索引。使用 route print 命令可以顯示介面及其對應介面索引的列表。對於介面索引可以使用十進制或十六進制的值。對於十六進制值,要在十六進制數的前面加上 0x。忽略 if 參數時,介面由網關地址確定。 /? 在命令提示符下顯示幫助。 注釋 路由表中 metric 一列的值較大是由於允許 TCP/IP 根據每個 LAN 介面的 IP 地址、子網掩碼和默認網關的配置自動確定路由表中路由的躍點數造成的。默認啟動的自動確定介面躍點數確定了每個介面的速度,調整了每個介面的路由躍點數,因此最快介面所創建的路由具有最低的躍點數。要刪除大躍點數,請在每個 LAN 連接的 TCP/IP 協議的高級屬性中禁用自動確定介面躍點數。 如果在 systemroot\System32\Drivers\Etc 文件夾的本地網路文件中存在適當的條目,名稱可以用於 Destination。只要名稱可以通過「域名系統 (DNS)」查詢這樣的標准主機名解析技術分解為 IP 地址,就可以將其用於 Gateway,DNS 查詢使用存儲在 systemroot\System32\Drivers\Etc 文件夾下的本地主機文件和 NetBIOS 名稱解析。 如果是 print 或 delete 命令,可以忽略 Gateway 參數,使用通配符來表示目標和網關。Destination 的值可以是由星號 (*) 指定的通配符。如果指定目標含有一個星號 (*) 或問號 (?),它被看作是通配符,只列印或刪除匹配的目標路由。星號代表任意一字元序列,問號代表任一字元。例如, 10.*.1, 192.168.*、 127.* 和 *224* 都是星號通配符的有效使用。 使用了無效的目標和子網掩碼(網掩碼)值的組合,會顯示「Route:bad gateway address netmask」錯誤消息。目標中有一位或多位設置為 1,而其在子網掩碼中的對應位設置為 0 時會發生這個錯誤。可以通過二進製表示法表示目標和子網掩碼來檢查這種情況。以二進製表示的子網掩碼包括表示目標網路地址部分的一連串的 1 和表示目標主機地址部分的一連串的 0 兩個部分。查看目標以確定目標的主機地址部分(由子網掩碼所定義)是否有些位設置成了 1。 只有在 Windows NT 4.0、Windows 2000、Windows Millennium Edition、Windows XP 和 Windows Server 2003 家族運行 route 命令才支持 -p 參數。在 Windows 95 或 Windows 98 上運行 route 命令時不支持該參數。 只有當「Internet 協議 (TCP/IP)」在 網路連接中安裝為網路適配器屬性的組件時,該命令才可用。 示例 要顯示 IP 路由表的完整內容,請鍵入: route print 要顯示 IP 路由表中以 10. 開始的路由,請鍵入: route print 10.* 要添加默認網關地址為 192.168.12.1 的默認路由,請鍵入: route add 0.0.0.0 mask 0.0.0.0 192.168.12.1 要添加目標為 10.41.0.0,子網掩碼為 255.255.0.0,下一個躍點地址為 10.27.0.1 的路由,請鍵入: route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 要添加目標為 10.41.0.0,子網掩碼為 255.255.0.0,下一個躍點地址為 10.27.0.1 的永久路由,請鍵入: route -p add 10.41.0.0 mask 255.255.0.0 10.27.0.1 要添加目標為 10.41.0.0,子網掩碼為 255.255.0.0,下一個躍點地址為 10.27.0.1,躍點數為 7 的路由,請鍵入: route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7 要添加目標為 10.41.0.0,子網掩碼為 255.255.0.0,下一個躍點地址為 10.27.0.1,介面索引為 0x3 的路由,請鍵入: route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 if 0x3 要刪除目標為 10.41.0.0,子網掩碼為 255.255.0.0 的路由,請鍵入: route delete 10.41.0.0 mask 255.255.0.0 要刪除 IP 路由表中以 10. 開始的所有路由,請鍵入: route delete 10.* 要將目標為 10.41.0.0,子網掩碼為 255.255.0.0 的路由的下一個躍點地址由 10.27.0.1 更改為 10.27.0.25,請鍵入: route change 10.41.0.0 mask 255.255.0.0 10.27.0.25
Ⅹ win10怎樣通過命令行重新注冊動態鏈接庫文件
win10通過命令行重新注冊動態鏈接庫文件如下:
1、首先同時按下Win+r鍵打開運行窗口,輸入regsvr32,點擊確定即可。2、執行後能看到相關的幫助命令參數。要注冊某個DLL文件,則在命令後面接相應的dll文件,具體看後面的操作。DLL是動態鏈接庫的簡稱,使用命令注冊的DLL類型屬於組件式的DLL文件,組件式的DLL文件與普通的DLL文件不同之處在於默認導出四個函數,在編程的時候可以看到這四個導出函數DllGetClassObject,DllRegisterServer,DllUnregisterServer和DllMain。