⑴ 在Red Hat linux 中程序函數庫可以分為哪幾種類型 它們的調用方法各是什麼請說出nm和ldd兩個命令的作
1)、在Red Hat Linux中函數庫可以分為3種類型:靜態函數庫、共享函數庫和動態載入函數庫。
靜態函數庫在應用程序編譯時就把函數的執行代碼加入到應用程序中。
共享函數庫中的函數當一個可執行程序啟動時被載入。
動態載入函數庫可以在程序運行的任何階段載入函數。
2)、使用nm和ldd命令可以獲得關於庫函數的信息。
nm命令可以列出一個函數庫文件中的符號表,它對靜態的庫函數和共享的庫函數都能起作用。
ldd命令可以列出一個程序正常運行所需要的共享庫。
3)、庫函數預設存放在/lib和/usr/lib中,以及動態庫配置文件內所列的目錄中。
如果庫函數沒有在這些目錄下,可以在中加入所須目錄,後運行ldconfig命令,使之生效。或設置環境變數LD_LIBRARY_PATH或LD_PRELOAD加入庫函數所存放的目錄。
還有不會的請參考《linux就該這么學》,針對各種linux疑難雜症,幫助linux學習者。
⑵ linux 查看當前的網路配置
linux 查看當前的網路配置
1、執行 ifconfig命令,結果如下可以查看到ip、mac地址等相關網路配置
配置說明
DEVICE=eth0網卡設備名,eth0表示第一張網卡
BOOTPROTO=none是否自動獲取IP(none、static、dhcp),當值為dhcp時,只需配置上述例子中的那幾項就可以聯網
HWADDR=00:0C:29:11:30:39MAC地址
NM_CONTROLLED=yes是否可以由Network Manager圖形管理工具託管
ONBOOT=yes是否隨網路服務啟動當前網卡生效(在CentOS 6 以上的版本中ONBOOT是默認關閉的。)
TYPE=Ethernet網路類型,這里為乙太網
UUID=5ab36190-a5df-4bf1-94d8-6c126afd05f1唯一識別碼
IPADDR=192.168.0.200IP地址
NETMASK=255.255.255.0子網掩碼
GATEWAY=192.168.0.1網關
DNS1=202.106.0.20DNS
IPV6INIT=noIPv6是否啟用,這里設置為不啟用
USERCTL=no是否允許非root用戶控制此網卡,這里為不允許
⑶ Linux裡面nm是什麼意思
這是一個非常罕察閉見的命令,搞Linux開發的人, 才可能會用到nm命令,其他老男孩Linux運維等幾乎用不到。
nm命令是names的縮寫, nm命令主要是用來列出某些文件中的符號(說白了就是一些敗巧裂函數和全局變數等),具體查寬神看,可以網路 搜 linux nm。
⑷ linux系統C語言的nm是什麼意思
不是C語言吧?是森笑游系統命令。用來列舉object文件(比如編譯出的a.out)的symbols.
用法是:
nm [-a|--debug-syms] [-g|--extern-only]
[-B] [-C|--demangle[=style]] [-D|--dynamic]
[-S|--print-size] [-s|--print-armap]
[-A|-o|--print-file-name]
[-n|-v|--numeric-sort] [-p|--no-sort]
[-r|--reverse-sort] [--size-sort] [-u|--undefined-only]
[-t radix|--radix=radix] [-P|--portability]
[--target=bfdname] [-fformat|--format=format]
[--defined-only] [-l|--line-numbers] [--no-demangle]
[-V|--version] [-X 32_64] [--help] [objfile...]
具體而言,nm用來列出目標文件的符號清單。
如果沒有為nm命令升唯指出目標文件,則nm假定目標文件是a.out。下面列出該命令的任選項,大部分支持「-」開頭的短格式和「-「開頭的長格式。
-A、-o或--print-file-name:在找到的各個符號的名字前加上文件名,而不是在此文件的所有符號前只出現文件名一次。
例如nmlibtest.a的輸出如下:
CPThread.o:
00000068TMain__8CPThreadPv
00000038TStart__8CPThread
00000014T_._8CPThread
00000000T__8CPThread
00000000?__FRAME_BEGIN__
…………………………………
則nm-A的輸出如下:
libtest.a:CPThread.o:00000068TMain__8CPThreadPv
libtest.a:CPThread.o:00000038TStart__8CPThread
libtest.a:CPThread.o:00000014T_._8CPThread
libtest.a:CPThread.o:00000000T__8CPThread
libtest.a:CPThread.o:00000000?__FRAME_BEGIN__
…………………………………………………………..
-a或--debug-syms:顯示調試符號。
-B:等同於--format=bsd,用來兼容MIPS的nm。
-C或--demangle:將低級符號名解碼(demangle)成用戶級名字。這樣可以使得C 函數名具有可讀性。
-D或--dynamic:顯示動態符號。該任選項僅對於動態目標(例如特定類型的共享庫)有意義。
-fformat:使用format格式輸出。format可以選取bsd、sysv或posix,該選項在GNU的nm中有用。默認為bsd。
-g或--extern-only:僅顯示外部符號。
-n、-v或--numeric-sort:按符號對應地址的順序排序,而非按符號名的字元順序。
-p或--no-sort:按目標此銷文件中遇到的符號順序顯示,不排序。
-P或--portability:使用POSIX.2標准輸出格式代替默認的輸出格式。等同於使用任選項-fposix。
-s或--print-armap:當列出庫中成員的符號時,包含索引。索引的內容包含:哪些模塊包含哪些名字的映射。
-r或--reverse-sort:反轉排序的順序(例如,升序變為降序)。
--size-sort:按大小排列符號順序。該大小是按照一個符號的值與它下一個符號的值進行計算的。
-tradix或--radix=radix:使用radix進制顯示符號值。radix只能為「d」表示十進制、「o」表示八進制或「x」表示十六進制。
--target=bfdname:指定一個目標代碼的格式,而非使用系統的默認格式。
-u或--undefined-only:僅顯示沒有定義的符號(那些外部符號)。
-l或--line-numbers:對每個符號,使用調試信息來試圖找到文件名和行號。對於已定義的符號,查找符號地址的行號。對於未定義符號,查找指向符號重定位入口的行號。如果可以找到行號信息,顯示在符號信息之後。
-V或--version:顯示nm的版本號。
--help:顯示nm的任選項。
ar cs libmy.a//創建一個庫
ar rs libmy.a 1.o//增加一個模塊
ar t libmy.a//顯示庫里的模塊
ar d libmy.a 1.o//刪除一個模塊
⑸ Boot分區和root分區是什麼
boot分區概述:
/boot分區就是操作系統的內核及在引導過程中使用的文件,一般是幾年前的版本要求劃分的一個區,大小為100MB左右,但現在的新版本都不需要對這個分區進行單獨劃分,也就是說你完全可以不分/boot。
安裝Linux只要求兩個基本分區,即根分區及交換分區,如果你的磁碟空間足夠大,可以多劃分空間給根分區,你也可以把常用的目錄新建到桌面,如下載的軟體包,放到桌面不影響你進入Linux系統的速度,當然這要求你有足夠大的根分區。
BOOT目錄下的文件:
vmlinuz
vmlinuz是可引導的、壓縮的內核。「vm」代表「Virtual Memory」。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制。Linux能夠使用硬碟空間作為虛擬內存,因此得名「vm」。vmlinuz是可執行的Linux內核,它位於/boot/vmlinuz。
vmlinuz的建立有兩種方式。一是編譯內核時通過「make zImage」創建,然後通過:「cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz」產生。zImage適用於小內核的情況,它的存在是為了向後的兼容性。
二是內核編譯時通過命令make bzImage創建,然後通過:「cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz」產生。bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示「big zImage」。 bzImage中的b是「big」意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有gzip解壓縮代碼。所以你不能用gunzip 或 gzip –dc解包vmlinuz。 內核文件中包含一個微型的gzip用於解壓縮內核並引導它。兩者的不同之處在於,老的zImage解壓縮內核到低端內存(第一個640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那麼可以採用zImage或bzImage之一,兩種方式引導的系統運行時是相同的。大的內核採用bzImage,不能採用zImage。vmlinux是未壓縮的內核,vmlinuz是vmlinux的壓縮文件。
initrd-x.x.x.img
initrd是「initial ramdisk」的簡寫。initrd一般被用來臨時的引導硬體到實際內核vmlinuz能夠接管並繼續引導的狀態。initrd-2.4.7-10.img主要是用於載入ext3等文件系統及scsi設備的驅動。比如,使用的是scsi硬碟,而內核vmlinuz中並沒有這個scsi硬體的驅動,那麼在裝入scsi模塊之前,內核不能載入根文件系統,但scsi模塊存儲在根文件系統的/lib/moles下。為了解決這個問題,可以引導一個能夠讀實際內核的initrd內核並用initrd修正scsi引導問題。initrd-2.4.7-10.img是用gzip壓縮的文件,initrd實現載入一些模塊和安裝文件系統等功能。
initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的。其它Linux發行版或許有相應的命令,:man mkinitrd下面的命令創建initrd映象文件[1] 。
System.map
System.map是一個特定內核的內核符號表。它是你當前運行的內核的System.map的鏈接。內核符號表是怎麼創建的呢? System.map是由「nm vmlinux」產生並且不相關的符號被濾出。
編譯內核時,System.map創建在/usr/src/linux-2.4/System.map。像下面這樣:
nm /boot/vmlinux-2.4.7-10 > System.map
nm vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
然後復制到/boot:
cp /usr/src/linux/System.map /boot/System.map-2.4.7-10
是System.map文件的一部分:
在進行程序設計時,會命名一些變數名或函數名之類的符號。Linux內核是一個很復雜的代碼塊,有許許多多的全局符號。
Linux內核不使用符號名,而是通過變數或函數的地址來識別變數或函數名。比如不是使用size_t BytesRead這樣的符號,而是像c0343f20這樣引用這個變數。
對於使用計算機的人來說,更喜歡使用那些像size_t BytesRead這樣的名字,而不喜歡像c0343f20這樣的名字。內核主要是用c寫的,所以編譯器/連接器允許我們編碼時使用符號名,當內核運行時使用地址。
然而,在有的情況下,我們需要知道符號的地址,或者需要知道地址對應的符號。這由符號表來完成,符號表是所有符號連同它們的地址的列表。就是一個內核符號表,可知變數名checkCPUtype在內核地址c01000a5。
Linux 符號表使用到2個文件:
/proc/ksyms
System.map
/proc/ksyms是一個「proc file」,在內核引導時創建。實際上,它並不真正的是一個文件,它只不過是內核數據的表示,卻給人們是一個磁碟文件的假象,這從它的文件大小是0可以看出來。然而,System.map是存在於你的文件系統上的實際文件[1] 。
當你編譯一個新內核時,各個符號名的地址要發生變化,你的老的System.map具有的是錯誤的符號信息。每次內核編譯時產生一個新的System.map,你應當用新的System.map來取代老的System.map。
雖然內核本身並不真正使用System.map,但其它程序比如klogd,lsof和ps等軟體需要一個正確的System.map。如果你使用錯誤的或沒有System.map,klogd的輸出將是不可靠的,這對於排除程序故障會帶來困難。沒有System.map,你可能會面臨一些令人煩惱的提示信息。
另外少數驅動需要System.map來解析符號,沒有為你當前運行的特定內核創建的System.map它們就不能正常工作。
Linux的內核日誌守護進程klogd為了執行名稱-地址解析,klogd需要使用System.map。System.map應當放在使用它的軟體能夠找到它的地方。執行:man klogd可知,如果沒有將System.map作為一個變數的位置給klogd,那麼它將按照下面的順序,在三個地方查找System.map:
/boot/System.map
/System.map
/usr/src/linux/System.map
System.map也有版本信息,klogd能夠智能地查找正確的映象(map)文件。
root是管理員的配置信息目錄
root在linux和unix里是最高許可權
⑹ /home/linux-2.6.25.8/scripts/mksysmap: line 43:arm-linux-nm command not found 怎麼改
這個是因為你在那個文件中使用了arm-linux-nm這個命令,但是你的系統里並沒有這個命令。
簡單來說,你打一個顯示當前文件夾內容的 ls 命令,但是如果你系統里沒有這個命令,那麼系統也會提示command not found,當然也不會顯示當前文件夾內容。
這類問題常見於使用交叉編譯鏈編譯文件時,由於沒有正確設禪答置編譯鏈,系統無法找到對應的命令。依照經驗,arm-linux-nm應該是交叉編譯指令。
改正方法應該是,檢查你的編譯工具設置和makefile文件(可能沒有),看二者與要編譯的目標文件是否匹配,檢查方法請參照你的板子手冊含逗或者開發指導。正確設置後,重新執行或者編談襲賣譯。
⑺ 如何查看linux下so庫里的符號
這個一般沒有要求。一般/lib /usr/lib 其它的要看具體情況。。。 如果你是自己編譯的應用程序,.so文件一般就在安裝目錄下的lib目錄中。
⑻ linux下C程序段錯誤,
1. 段錯誤是什麼
一句話來說,段錯誤是指訪問的內存超出了系統給這個程序所設定的內存空間,例如訪問了不存在的內存地址、訪問了系統保護的內存地址、訪問了只讀的內存地址等等情況。這里貼一個對於「段錯誤」的准確定義(參考Answers.com):
A segmentation fault (often shortened to segfault) is a particular error condition that can occur ring the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.
On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
2. 段錯誤產生的原因
2.1 訪問不存在的內存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr = NULL;
*ptr = 0;
}
2.2 訪問系統保護的內存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr = (int *)0;
*ptr = 100;
}
2.3 訪問只讀的內存地址
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *ptr = "test";
strcpy(ptr, "TEST");
}
2.4 棧溢出
#include<stdio.h>
#include<stdlib.h>橋埋埋
void main()
{
main();
}
等等其他原因。
3. 段錯誤信息的獲取
程序發生段錯誤時,提示信息很少,下面有幾種查看段錯誤的發生信息的途徑。
3.1 dmesg
dmesg可以在應用程序crash掉時,顯示內核中保存的相關信息。如下所示,通過dmesg命令可以查看發生段錯誤的程序名稱、引起段錯誤發生的內存地址、敏螞指令指針地址、堆棧指針地址、錯誤代碼、錯誤原因等液沖。以程序2.3為例:
panfeng@ubuntu:~/segfault$ dmesg
[ 2329.479037] segfault3[2700]: segfault at 80484e0 ip 00d2906a sp bfbbec3c error 7 in libc-2.10.1.so[cb4000+13e000]
3.2 -g
使用gcc編譯程序的源碼時,加上-g參數,這樣可以使得生成的二進制文件中加入可以用於gdb調試的有用信息。以程序2.3為例:
panfeng@ubuntu:~/segfault$ gcc -g -o segfault3 segfault3.c
3.3 nm
使用nm命令列出二進制文件中的符號表,包括符號地址、符號類型、符號名等,這樣可以幫助定位在哪裡發生了段錯誤。以程序2.3為例:
panfeng@ubuntu:~/segfault$ nm segfault3
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
080484ec r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a014 A __bss_start
0804a00c D __data_start
08048490 t __do_global_ctors_aux
08048360 t __do_global_dtors_aux
0804a010 D __dso_handle
w __gmon_start__
0804848a T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048420 T __libc_csu_fini
08048430 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a014 A _edata
0804a01c A _end
080484bc T _fini
080484d8 R _fp_hw
080482bc T _init
08048330 T _start
0804a014 b completed.6990
0804a00c W data_start
0804a018 b dtor_idx.6992
080483c0 t frame_mmy
080483e4 T main
U memcpy@@GLIBC_2.0
3.4 ldd
使用ldd命令查看二進製程序的共享鏈接庫依賴,包括庫的名稱、起始地址,這樣可以確定段錯誤到底是發生在了自己的程序中還是依賴的共享庫中。以程序2.3為例:
panfeng@ubuntu:~/segfault$ ldd ./segfault3
linux-gate.so.1 => (0x00e08000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00675000)
/lib/ld-linux.so.2 (0x00482000)