一種程序符號(hào)表的獲取方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種程序符號(hào)表獲取方法及系統(tǒng)。
【背景技術(shù)】
[0002] 在計(jì)算機(jī)科學(xué)中,符號(hào)表是一種用于語(yǔ)言翻譯器(例如編譯器和解釋器)中的數(shù)據(jù) 結(jié)構(gòu)。在符號(hào)表中,程序源代碼中的每個(gè)標(biāo)識(shí)符都和它的聲明或使用信息綁定在一起,比如 其數(shù)據(jù)類型、作用域以及內(nèi)存地址。符號(hào)表在編譯程序工作的過(guò)程中需要不斷收集、記錄和 使用源程序中一些語(yǔ)法符號(hào)的類型和特征等相關(guān)信息。這些信息一般以表格形式存儲(chǔ)于系 統(tǒng)中。如常數(shù)表、變量名表、數(shù)組名表、過(guò)程名表、標(biāo)號(hào)表等等,統(tǒng)稱為符號(hào)表。對(duì)于符號(hào)表組 織、構(gòu)造和管理方法的好壞會(huì)直接影響編譯系統(tǒng)的運(yùn)行效率。
[0003] 符號(hào)表是程序在編譯時(shí)產(chǎn)生的調(diào)試信息,通常情況下程序運(yùn)行是用不到符號(hào)表 的,因此程序在編譯后經(jīng)常會(huì)將所有調(diào)試信息去掉,這樣能有效減少程序大小,或者干脆在 編譯過(guò)程中不產(chǎn)生符號(hào)表。但是在某些情況下,比如做異常分析時(shí)可能需要符號(hào)表,以便能 夠快速的根據(jù)函數(shù)地址找到函數(shù)名。
[0004] 現(xiàn)有技術(shù)中管理符號(hào)表的方法有兩種,一種是保留符號(hào)表信息,一種是將符號(hào)表 信息導(dǎo)出到特定文件中再刪除符號(hào)表信息。在程序編譯后,保留符號(hào)表信息,會(huì)導(dǎo)致程序占 用較大的空間,優(yōu)點(diǎn)是可以隨時(shí)查看符號(hào)表。在程序編譯后,將符號(hào)表信息導(dǎo)出到特定文件 中,然后將符號(hào)表從程序中刪除,程序不會(huì)占用較大空間,但是獲取符號(hào)表需要人工搜索文 件,使用起來(lái)不方便。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明所要解決的技術(shù)問(wèn)題是:現(xiàn)有的程序符號(hào)表的獲取方法導(dǎo)致程序占用較大 空間、獲取效率低的問(wèn)題。
[0006] 為解決上述技術(shù)問(wèn)題,本發(fā)明一方面提出了一種程序符號(hào)表的獲取方法,該方法 包括:
[0007] 提取程序調(diào)試信息中的符號(hào)表信息,將所述符號(hào)表信息保存在符號(hào)表源文件中;
[0008] 編譯所述符號(hào)表源文件,生成符號(hào)表動(dòng)態(tài)鏈接庫(kù);
[0009]運(yùn)行程序并加載所述符號(hào)表動(dòng)態(tài)鏈接庫(kù),獲取程序符號(hào)表。
[0010] 可選地,在所述提取程序調(diào)試信息中的符號(hào)表信息之前,還包括:
[0011] 構(gòu)造符號(hào)表源文件;
[0012] 相應(yīng)地,將所述符號(hào)表信息保存在符號(hào)表源文件中,包括:
[0013] 將所述符號(hào)表信息保存在特定文件中,將所述特定文件中的符號(hào)表信息追加寫入 至符號(hào)表源文件中;
[0014]其中,保存在特定文件中的符號(hào)表信息包括符號(hào)地址、符號(hào)名稱和符號(hào)類型。
[0015] 可選地,在將所述符號(hào)表信息保存在符號(hào)表源文件中之前,還包括:
[0016] 從特定文件中提取所述符號(hào)表信息中的符號(hào)地址和符號(hào)名稱;
[0017] 相應(yīng)地,保存在符號(hào)表源文件中的符號(hào)表信息為符號(hào)地址和符號(hào)名稱。
[0018] 可選地,所述運(yùn)行程序并加載所述符號(hào)表動(dòng)態(tài)鏈接庫(kù),獲取程序符號(hào)表包括:
[0019] 運(yùn)行程序,通過(guò)dlopen函數(shù)加載符號(hào)表動(dòng)態(tài)鏈接庫(kù);
[0020] 通過(guò)dlsym函數(shù)獲取程序符號(hào)表。
[0021] 可選地,在所述提取程序調(diào)試信息中的符號(hào)表信息之前,還包括:
[0022] 在編譯程序時(shí)為CFLAGS添加-g選項(xiàng),自動(dòng)生成包括符號(hào)表信息的調(diào)試信息。
[0023] 本發(fā)明另一方面提出了一種程序符號(hào)表的獲取系統(tǒng),該系統(tǒng)包括:
[0024] 符號(hào)表信息保存單元,用于提取程序調(diào)試信息中的符號(hào)表信息,將所述符號(hào)表信 息保存在符號(hào)表源文件中;
[0025] 動(dòng)態(tài)鏈接庫(kù)生成單元,用于編譯所述符號(hào)表源文件,生成符號(hào)表動(dòng)態(tài)鏈接庫(kù);
[0026] 程序符號(hào)表獲取單元,用于運(yùn)行程序并加載所述符號(hào)表動(dòng)態(tài)鏈接庫(kù),獲取程序符 號(hào)表。
[0027] 可選地,該系統(tǒng)還包括:符號(hào)表源文件構(gòu)造單元;
[0028] 所述符號(hào)表源文件構(gòu)造單元,用于構(gòu)造符號(hào)表源文件;
[0029]相應(yīng)地,所述符號(hào)表信息保存單元,用于將所述符號(hào)表信息保存在特定文件中,將 所述特定文件中的符號(hào)表信息追加寫入至符號(hào)表源文件中;
[0030]其中,保存在特定文件中的符號(hào)表信息包括符號(hào)地址、符號(hào)名稱和符號(hào)類型。
[0031 ]可選地,該系統(tǒng)還包括符號(hào)表信息過(guò)濾單元;
[0032] 所述符號(hào)表信息過(guò)濾單元,用于從特定文件中提取所述符號(hào)表信息中的符號(hào)地址 和符號(hào)名稱;
[0033] 相應(yīng)地,保存在符號(hào)表源文件中的符號(hào)表信息為符號(hào)地址和符號(hào)名稱。
[0034] 本發(fā)明提供的程序符號(hào)表的獲取方法及系統(tǒng),不需要人工搜索獲取符號(hào)表,同時(shí) 不增加程序的空間,有效地解決了現(xiàn)有的程序符號(hào)表的獲取方法導(dǎo)致程序占用較大空間、 獲取效率低的問(wèn)題,節(jié)省了程序運(yùn)行空間,提高了獲取符號(hào)表的效率。
【附圖說(shuō)明】
[0035]通過(guò)參考附圖會(huì)更加清楚的理解本發(fā)明的特征和優(yōu)點(diǎn),附圖是示意性的而不應(yīng)理 解為對(duì)本發(fā)明進(jìn)行任何限制,在附圖中:
[0036] 圖1示出了本發(fā)明一個(gè)實(shí)施例的程序符號(hào)表的獲取方法的示意圖;
[0037] 圖2示出了本發(fā)明另一個(gè)實(shí)施例的程序符號(hào)表的獲取系統(tǒng)的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0038]下面將結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)描述。
[0039] 圖1是本發(fā)明一個(gè)實(shí)施例的程序符號(hào)表的獲取方法的示意圖。如圖1所示,該程序 符號(hào)表的獲取方法包括:
[0040] S1:提取程序調(diào)試信息中的符號(hào)表信息,將所述符號(hào)表信息保存在符號(hào)表源文件 中;
[0041 ] S2:編譯所述符號(hào)表源文件,生成符號(hào)表動(dòng)態(tài)鏈接庫(kù);
[0042] S3:運(yùn)行程序并加載所述符號(hào)表動(dòng)態(tài)鏈接庫(kù),獲取程序符號(hào)表。
[0043] 本實(shí)施例的程序符號(hào)表的獲取方法及系統(tǒng),不需要人工搜索獲取符號(hào)表,同時(shí)不 增加程序的空間,有效地解決了現(xiàn)有的程序符號(hào)表的獲取方法導(dǎo)致程序占用較大空間、獲 取效率低的問(wèn)題,節(jié)省了程序運(yùn)行空間,提高了獲取符號(hào)表的效率。
[0044] 在一種可選的實(shí)施方式中,可選地,在所述提取程序調(diào)試信息中的符號(hào)表信息之 前,還包括:
[0045] 構(gòu)造符號(hào)表源文件;
[0046] 相應(yīng)地,將所述符號(hào)表信息保存在符號(hào)表源文件中,包括:
[0047] 將所述符號(hào)表信息保存在特定文件中,將所述特定文件中的符號(hào)表信息追加寫入 至符號(hào)表源文件中;
[0048] 其中,保存在特定文件中的符號(hào)表信息包括符號(hào)地址、符號(hào)名稱和符號(hào)類型。
[0049] 符號(hào)表源文件包含以全局?jǐn)?shù)組形式存在的符號(hào)信息,全局?jǐn)?shù)組的每一項(xiàng)表示一條 符號(hào)信息,該全局?jǐn)?shù)組就是最后使用的程序運(yùn)行符號(hào)表的源代碼。
[0050] 可選地,在將所述符號(hào)表信息保存在符號(hào)表源文件中之前,還包括:
[0051] 從特定文件中提取所述符號(hào)表信息中的符號(hào)地址和符號(hào)名稱;
[0052] 相應(yīng)地,保存在符號(hào)表源文件中的符號(hào)表信息為符號(hào)地址和符號(hào)名稱。
[0053] 可選地,所述運(yùn)行程序并加載所述符號(hào)表動(dòng)態(tài)鏈接庫(kù),獲取程序符號(hào)表包括:
[0054]運(yùn)行程序,通過(guò)dlopen函數(shù)加載符號(hào)表動(dòng)態(tài)鏈接庫(kù);
[0055] 通過(guò)dlsym函數(shù)獲取程序符號(hào)表。
[0056] 可選地,在所述提取程序調(diào)試信息中的符號(hào)表信息之前,還包括:
[0057] 在編譯程序時(shí)為CFLAGS添加-g選項(xiàng),自動(dòng)生成包括符號(hào)表信息的調(diào)試信息。
[0058] 下面以一個(gè)具體的實(shí)施方式為例說(shuō)明本發(fā)明程序符號(hào)表的獲取方法。
[0059] (1)在編譯程序時(shí)為CFLAGS添加-g選項(xiàng),這樣在編譯過(guò)程中會(huì)自動(dòng)生成包括符號(hào) 表的調(diào)試信息。
[0060] (2)在程序編譯完成后,通過(guò)命令"nm-n程序名>list.l",將程序的符號(hào)表提取出 來(lái),放到list. 1這個(gè)文件中。
[0061] (3)此時(shí),list. 1中包含的信息比較多,有一些是不需要的,因此需要對(duì)其進(jìn)行過(guò) 濾。sed-e"/~/d" list. l>list.