當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]解析基于ELF的嵌入式軟件源碼級(jí)交叉調(diào)試技術(shù)

開發(fā)任何一個(gè)軟件都不可避免地存在各種錯(cuò)誤,要修正錯(cuò)誤必須找出其錯(cuò)誤原因。通常程序員利用調(diào)試器來(lái)跟蹤程序執(zhí)行情況,快速有效地定位錯(cuò)誤產(chǎn)生的位置從而找到引起錯(cuò)誤的原因,并改正錯(cuò)誤。

調(diào)試器為用戶提供的主要功能包括:在目標(biāo)程序中設(shè)置、刪除斷點(diǎn);以單步執(zhí)行或連續(xù)執(zhí)行等方式控制目標(biāo)程序運(yùn)行;瀏覽程序中的變量或表達(dá)式的值;查看、修改目標(biāo)機(jī)寄存器的內(nèi)容;查看、修改目標(biāo)機(jī)內(nèi)存的內(nèi)容。源碼級(jí)調(diào)試器是面向高級(jí)語(yǔ)言的符號(hào)調(diào)試工具,它基于源代碼的語(yǔ)句和符號(hào)跟蹤觀察目標(biāo)程序,同時(shí)提供基于匯編級(jí)的程序跟蹤功能以滿足用戶底層的調(diào)試需要。通用計(jì)算機(jī)軟件一般在同一臺(tái)機(jī)器上進(jìn)行編輯、編譯、調(diào)試;而嵌入式軟件的目標(biāo)系統(tǒng)多為特殊的專用系統(tǒng),通常采用宿主機(jī)/目標(biāo)機(jī)開發(fā)環(huán)境,借助通用計(jì)算機(jī)作為編輯源文件的宿主機(jī),利用交叉編譯器在宿主機(jī)上編譯生成目標(biāo)機(jī)的可執(zhí)行代碼,調(diào)試時(shí)通過(guò)通訊介質(zhì)(串線或網(wǎng)絡(luò))將目標(biāo)代碼下載到目標(biāo)系統(tǒng)上運(yùn)行,利用交叉調(diào)試器進(jìn)行跟蹤調(diào)試。

一、源碼級(jí)交叉調(diào)試器的實(shí)現(xiàn)途徑

程序運(yùn)行過(guò)程中目標(biāo)程序的指令代碼和數(shù)據(jù)都映射到目標(biāo)機(jī)上相應(yīng)的內(nèi)存內(nèi)容,為了實(shí)現(xiàn)源碼級(jí)調(diào)試,利用目標(biāo)文件中在程序編譯鏈接時(shí)生成的調(diào)試信息來(lái)實(shí)現(xiàn)目標(biāo)程序與源程序之間的映射,從而在源碼級(jí)實(shí)現(xiàn)對(duì)程序執(zhí)行情況的控制和觀察。其關(guān)鍵在于找到調(diào)試控制點(diǎn)和數(shù)據(jù)在源程序與目標(biāo)程序之間的映射關(guān)系。

任何數(shù)據(jù)都有名和值兩個(gè)側(cè)面,數(shù)據(jù)名與數(shù)據(jù)值之間的映射關(guān)系為:根據(jù)數(shù)據(jù)名得到存放該數(shù)據(jù)值的內(nèi)存地址,再?gòu)哪繕?biāo)機(jī)的內(nèi)存地址取出其內(nèi)容即為數(shù)據(jù)值:

調(diào)試中的程序控制點(diǎn)通常為源程序中的函數(shù)、語(yǔ)句行等,它們對(duì)應(yīng)于裝載到目標(biāo)內(nèi)存中的相應(yīng)目標(biāo)代碼,要實(shí)現(xiàn)程序的運(yùn)行控制關(guān)鍵在于得到源代碼與目標(biāo)代碼之間的映射關(guān)系:由源碼定位信息得到相應(yīng)的目標(biāo)碼信息;由目標(biāo)碼地址得到相應(yīng)的源碼定位信息。源碼定位信息為源文件名+行號(hào)或函數(shù)名;目標(biāo)碼信息為目標(biāo)指令在目標(biāo)機(jī)內(nèi)存中的起始和終止地址。

嵌入式軟件以宿主機(jī)/目標(biāo)機(jī)模式開發(fā),其交叉調(diào)試器分為宿主機(jī)部分和目標(biāo)機(jī)部分,兩者以統(tǒng)一的通訊協(xié)議進(jìn)行通信,宿主機(jī)向目標(biāo)機(jī)發(fā)送命令,目標(biāo)機(jī)接收、執(zhí)行命令并將結(jié)果返回宿主機(jī),從而實(shí)現(xiàn)兩機(jī)之間的交互控制。免費(fèi)軟件基金會(huì)FSF提供的調(diào)試工具gdb具有一套比較成熟的通訊協(xié)議----remote通訊協(xié)議,該協(xié)議作為開放軟件被廣為采用,在此我們選擇了rmote協(xié)議作為交叉調(diào)試器的遠(yuǎn)程通訊協(xié)議。

二、ELF格式目標(biāo)文件

目標(biāo)文件是實(shí)現(xiàn)源碼級(jí)調(diào)試的基礎(chǔ),需要詳細(xì)分析文件的格式及內(nèi)容以從中獲取有用的調(diào)試信息。在設(shè)計(jì)調(diào)試器時(shí)采用可執(zhí)行連接格式――ELF格式目標(biāo)文件作為開發(fā)基礎(chǔ),ELF(Executable and Linking Format)是UNIX系統(tǒng)實(shí)驗(yàn)室(USL)作為應(yīng)用程序二進(jìn)制接口(Application Binary Interface(ABI))而開發(fā)和發(fā)布的,已被軟件業(yè)廣泛采用,在Linux系統(tǒng)中ELF格式是其默認(rèn)的目標(biāo)文件格式,許多嵌入式軟件都采用ELF格式作為目標(biāo)文件格式。

ELF目標(biāo)文件主要有三種類型:可重定位文件,可執(zhí)行文件,共享的目標(biāo)文件,我們以可執(zhí)行文件為分析對(duì)象。

ELF頭固定在文件的起始位置,其它各部分的位置由ELF頭及其它相關(guān)信息獲得。

1、ELF頭

ELF頭是整個(gè)文件的入口,具有固定的長(zhǎng)度,52個(gè)字節(jié),包含14個(gè)值。包括ELF文件標(biāo)識(shí),程序頭表和節(jié)頭表的位置、長(zhǎng)度,文件中段的數(shù)目和節(jié)的數(shù)目等信息。

2、程序頭表與段

程序頭表中有多個(gè)表項(xiàng),每個(gè)表項(xiàng)是一個(gè)程序段的信息,固定長(zhǎng)度為32個(gè)字節(jié),包含8個(gè)值,包括段在文件中的位置,段在內(nèi)存中的起始虛擬地址,段的長(zhǎng)度及其它屬性等。調(diào)試器根據(jù)程序頭表中的信息來(lái)確定需要下載到目標(biāo)機(jī)上的目標(biāo)文件內(nèi)容(指令與數(shù)據(jù))及其在目標(biāo)機(jī)中的內(nèi)存地址。

3、節(jié)頭表與節(jié)

節(jié)頭表中也有多個(gè)表項(xiàng),每個(gè)表項(xiàng)是一個(gè)節(jié)的信息,固定長(zhǎng)度為40個(gè)字節(jié),包含10個(gè)值,包括節(jié)名、節(jié)的類型、該節(jié)在文件中的位置、該節(jié)在內(nèi)存中的起始地址(如果該節(jié)出現(xiàn)在內(nèi)存映象中)、節(jié)的長(zhǎng)度等信息。某些節(jié)是程序段的組成部分,如包含程序二進(jìn)制指令代碼的正文節(jié).text和數(shù)據(jù)節(jié).rodata,.hash等,某些節(jié)不作為段的組成部分,只提供其它的額外信息。為源碼調(diào)試服務(wù)的有 .debug,.line,.symtab,.debug_ pubname,.debug_range等節(jié),其中.debug, .line節(jié)包含了源碼調(diào)試信息的基本內(nèi)容。

.debug節(jié)中有多種類型的記錄,可分為幾大類:

(1)、編譯模塊信息:包含組成該文件的各個(gè)模塊的源文件名,路徑,及該模塊的代碼地址范圍等。

(2)、子程序信息:包含程序名,程序類型,起始終止地址,程序返回結(jié)果存放地址等。

(3)、變量信息:包含變量名、變量類型、變量存放地址信息等,變量有多種類型,簡(jiǎn)單變量、結(jié)構(gòu)變量等類型的變量其信息內(nèi)容各有不同。

將.debug節(jié)中各項(xiàng)內(nèi)容的結(jié)構(gòu)關(guān)系抽象為家族關(guān)系。以節(jié)的起始為根,首先是一個(gè)編譯單元的信息,它給出下一個(gè)編譯單元(兄弟關(guān)系)在文件中的相對(duì)位置。緊跟著編譯單元的是該編譯單元中的子程序與公共變量信息(父子關(guān)系),同樣的,編譯單元中頭一個(gè)函數(shù)記錄或變量記錄將給出它的兄弟的位置信息。緊隨該函數(shù)記錄的是該函數(shù)內(nèi)部的子程序與局部變量信息。相鄰層次成員是父子關(guān)系,同一層次上的成員是兄弟關(guān)系,如圖4所示:

.line節(jié)中包含目標(biāo)代碼地址與源代碼行號(hào)之間的對(duì)應(yīng)關(guān)系。對(duì)每個(gè)編譯單元給出其行記錄信息的長(zhǎng)度和目標(biāo)碼的起始基地址,以及該編譯單元中所有的行記錄,每條記錄以固定的格式表示:“該行目標(biāo)碼相對(duì)于基地址的偏移,列號(hào)(保留,暫未使用),行號(hào)”。

綜合上述程序段和節(jié)的內(nèi)容,即可確定源碼與目標(biāo)碼的映射關(guān)系。如給定一個(gè)文件名及行號(hào),確定其目標(biāo)代碼的信息。首先根據(jù)文件名確定其在.debug節(jié)中的編譯模塊信息,從中可得該文件模塊的起始終止地址;再由其起始地址找到該編譯模塊的行記錄信息在.line節(jié)中的位置,根據(jù)行號(hào)找到行記錄,得到該行目標(biāo)碼的地址范圍;由這些地址信息,可直接從目標(biāo)機(jī)內(nèi)存中取得目標(biāo)代碼,也可結(jié)合程序段信息從目標(biāo)文件的程序段中取得該行所對(duì)應(yīng)的目標(biāo)代碼指令內(nèi)容。調(diào)試器利用地址與指令信息就可以查看、修改、執(zhí)行相應(yīng)目標(biāo)代碼,供用戶進(jìn)行調(diào)試。[!--empirenews.page--]

三、源碼級(jí)交叉調(diào)試器實(shí)現(xiàn)的技術(shù)要點(diǎn)

在設(shè)計(jì)交叉調(diào)試器JDBG時(shí),首先完成與目標(biāo)文件無(wú)關(guān)的部分:連接目標(biāo)機(jī),查看修改目標(biāo)機(jī)寄存器和內(nèi)存;然后實(shí)現(xiàn)與目標(biāo)文件有關(guān)的部分:下載目標(biāo)文件到目標(biāo)機(jī),源碼級(jí)調(diào)試功能,包括斷點(diǎn)控制、執(zhí)行控制、變量觀察等,以下重點(diǎn)討論各項(xiàng)功能的設(shè)計(jì)與實(shí)現(xiàn)。

1、 下載目標(biāo)文件

目標(biāo)文件中包含多種類型的內(nèi)容,目標(biāo)程序在目標(biāo)機(jī)上運(yùn)行時(shí)只需要程序的二進(jìn)制指令代碼與相關(guān)數(shù)據(jù),這些內(nèi)容包含在文件中的可執(zhí)行程序段中。下載目標(biāo)文件時(shí)在宿主機(jī)上提取目標(biāo)文件中的代碼與數(shù)據(jù)段,根據(jù)其地址映射關(guān)系利用remote協(xié)議中寫內(nèi)存的功能在目標(biāo)機(jī)上建立程序的遠(yuǎn)程映像。

2、 斷點(diǎn)

斷點(diǎn)是調(diào)試器控制程序執(zhí)行的基本手段。各種機(jī)器有其特殊的斷點(diǎn)指令(如X86的int3指令),設(shè)置斷點(diǎn)就是將機(jī)器斷點(diǎn)指令替換所指定程序單元中的指令,使得程序運(yùn)行到斷點(diǎn)指令處時(shí),產(chǎn)生“斷點(diǎn)異常”,用戶程序不再繼續(xù)執(zhí)行下去,目標(biāo)機(jī)向宿主機(jī)返回?cái)帱c(diǎn)停止信號(hào),由宿主機(jī)調(diào)試器接管對(duì)用戶程序的控制。

斷點(diǎn)分為邏輯斷點(diǎn)與物理斷點(diǎn),兩者是多對(duì)一的關(guān)系。邏輯斷點(diǎn)與源代碼對(duì)應(yīng),提供源級(jí)斷點(diǎn)信息(源文件名+行號(hào)或物理地址等);物理斷點(diǎn)與目標(biāo)碼對(duì)應(yīng),提供斷點(diǎn)的目標(biāo)碼地址及斷點(diǎn)處的指令內(nèi)容。插入一個(gè)斷點(diǎn)即根據(jù)邏輯斷點(diǎn)信息確定物理斷點(diǎn)地址,將該地址對(duì)應(yīng)指令用機(jī)器斷點(diǎn)指令替代;刪除斷點(diǎn)即恢復(fù)斷點(diǎn)指令處預(yù)先保存的原指令,使得程序可繼續(xù)執(zhí)行。

檢查點(diǎn)是一種條件斷點(diǎn),使程序在條件滿足時(shí)停止執(zhí)行。通常條件都涉及表達(dá)式的值變化,利用寫內(nèi)存保護(hù)來(lái)檢查表達(dá)式的值是最常用的方法,但這種方法不適用于不具備MMU功能的處理器。某些處理器(如i386)提供了專門的調(diào)試控制寄存器,通過(guò)在調(diào)試控制寄存器中設(shè)置相應(yīng)線性地址及中止條件(讀或?qū)?即可中止程序的運(yùn)行。通過(guò)查詢方式檢查表達(dá)式的值也是一種可行的方法,其效率相對(duì)較低。當(dāng)檢查點(diǎn)的條件滿足時(shí),檢查點(diǎn)的操作與普通斷點(diǎn)類似。

對(duì)一個(gè)斷點(diǎn)應(yīng)具有基本的插入、刪除、使能、使不能等基本操作功能。在設(shè)計(jì)中采用雙向鏈表結(jié)構(gòu)作為斷點(diǎn)的數(shù)據(jù)結(jié)構(gòu),使得斷點(diǎn)控制更加方便高效。

3、 啟動(dòng)程序運(yùn)行

啟動(dòng)程序運(yùn)行首先從目標(biāo)文件的ELF頭中得到應(yīng)用程序的入口,將目標(biāo)機(jī)的PC寄存器置為該入口地址,從入口處開始執(zhí)行程序指令。如果程序中沒有設(shè)置任何斷點(diǎn)或檢查點(diǎn),則程序一直運(yùn)行到結(jié)束;如果程序中有斷點(diǎn),則程序運(yùn)行到第一個(gè)斷點(diǎn)處停止并返回其停止位置。

4、 源碼級(jí)單步調(diào)試

源碼級(jí)單步以行為單位,一行源代碼對(duì)應(yīng)多條機(jī)器指令,因此一個(gè)源語(yǔ)句的單步執(zhí)行需要多個(gè)機(jī)器指令的單步執(zhí)行。最簡(jiǎn)單的實(shí)現(xiàn)方法就是從源語(yǔ)句對(duì)應(yīng)目標(biāo)代碼的起始地址開始逐條單步執(zhí)行機(jī)器指令。顯然這種方法效率很低,尤其調(diào)試嵌入式軟件需要大量宿主機(jī)/目標(biāo)機(jī)間的通訊,而且有的處理器自身并不提供機(jī)器單步執(zhí)行指令。因此,更有效的方法是用“內(nèi)部臨時(shí)斷點(diǎn)+連續(xù)執(zhí)行”的方式來(lái)實(shí)現(xiàn)。

用機(jī)器單步執(zhí)行時(shí),每執(zhí)行完一條機(jī)器指令立即讀取當(dāng)前PC,判斷程序停止位置。調(diào)試器對(duì)程序的控制是即時(shí)交互的,當(dāng)單步執(zhí)行結(jié)束、跳轉(zhuǎn)或進(jìn)入函數(shù)調(diào)用時(shí),調(diào)試器都會(huì)即時(shí)得知。不采用機(jī)器單步,則不具有這種即時(shí)掌握程序運(yùn)行狀態(tài)的便利,需要在運(yùn)行前反匯編目標(biāo)代碼,通過(guò)分析匯編指令預(yù)測(cè)程序單步執(zhí)行可能的出口位置,并在該處設(shè)上斷點(diǎn)??赡艿某隹谖恢冒ㄔ撔兄噶畹慕K止地址、跳轉(zhuǎn)、分枝跳轉(zhuǎn)、函數(shù)調(diào)用等指令。對(duì)于跳轉(zhuǎn)指令,能得到絕對(duì)地址則直接在跳轉(zhuǎn)地址處設(shè)斷點(diǎn),不能得到跳轉(zhuǎn)地址則在指令處設(shè)斷點(diǎn),再執(zhí)行跳轉(zhuǎn)指令由當(dāng)前PC值確定程序停止的位置。對(duì)于函數(shù)調(diào)用指令,如果采用單步跳過(guò)(stepover)方式,則將其作為普通指令看待,直接執(zhí)行調(diào)用函數(shù);如果采用單步進(jìn)入(stepinto)方式,則需在指令處設(shè)斷點(diǎn),再執(zhí)行調(diào)用指令,以進(jìn)入函數(shù)內(nèi)部讓用戶繼續(xù)跟蹤程序的執(zhí)行。

以單步跳出方式(stepout)執(zhí)行程序時(shí),以子程序?yàn)閱挝?,需?zhí)行完當(dāng)前子程序的所有代碼,在調(diào)用該子程序的下一條語(yǔ)句處停止。通過(guò)反匯編當(dāng)前子程序的所有指令,可得到該子程序所有可能的函數(shù)返回出口,在這些函數(shù)返回指令處設(shè)臨時(shí)斷點(diǎn),程序運(yùn)行到斷點(diǎn)處再執(zhí)行該返回指令跳出當(dāng)前子程序,處理調(diào)用該子程序的語(yǔ)句行的后繼信息,最終確定程序停止位置。

5、數(shù)據(jù)瀏覽

數(shù)據(jù)與指令同樣是構(gòu)成程序的根本。數(shù)據(jù)類型繁多,不同的類型處理起來(lái)有所不同,其基本原理是由數(shù)據(jù)名找到存放該數(shù)據(jù)的地址,再?gòu)牡刂分腥〕鰯?shù)據(jù)的值。關(guān)鍵在于找到名與地址的映射關(guān)系。這些信息可從.debug,.symtab等節(jié)中得到。全局變量一般可得到直接的地址信息,而局部變量采用堆棧方式存放在內(nèi)存中,需根據(jù)從.debug中得到的該變量在堆棧中的位置信息來(lái)確定地址。采用表結(jié)構(gòu)來(lái)管理變量,將每個(gè)變量的名、地址等信息登記在表中,將對(duì)數(shù)據(jù)值的操作轉(zhuǎn)化為對(duì)相應(yīng)地址的內(nèi)存單元操作,如查看變量即為讀取該變量所在內(nèi)存單元的內(nèi)容。

四、交叉調(diào)試器JDBG簡(jiǎn)述

JDBG采用圖形用戶界面,相應(yīng)的命令提供圖形按鈕或菜單,并提供快捷鍵。進(jìn)入調(diào)試之前,先連接目標(biāo)機(jī),在連接時(shí)設(shè)置連接參數(shù)并保存,在以后的連接中可直接使用已保存的設(shè)置參數(shù)。當(dāng)宿主機(jī)/目標(biāo)機(jī)處于連接狀態(tài)時(shí),下載目標(biāo)文件,啟動(dòng)調(diào)試器。調(diào)試器啟動(dòng)后,用戶可在打開的源文件中設(shè)置斷點(diǎn),運(yùn)行下載的目標(biāo)程序,查看/修改寄存器、內(nèi)存的內(nèi)容。當(dāng)運(yùn)行的目標(biāo)程序停止后,返回停止點(diǎn)源碼信息,用戶可以觀察數(shù)據(jù),添加新的斷點(diǎn)或刪除已設(shè)斷點(diǎn),控制程序的單步執(zhí)行或連續(xù)執(zhí)行,或退出調(diào)試狀態(tài)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉