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