www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > strongerHuang
[導讀]關(guān)于計算機的文件有很多種,今天分享一種用于二進制文件、可執(zhí)行文件、目標代碼、共享庫和核心轉(zhuǎn)儲格式文件。

關(guān)注、星標公眾,不錯過精彩內(nèi)容

素材來源:綜合CSDN

編輯整理:strongerHuang


關(guān)于計算機的文件有很多種,今天分享一種用于二進制文件、可執(zhí)行文件、目標代碼、共享庫和核心轉(zhuǎn)儲格式文件。


一、ELF文件簡介

ELF:Executable and Linkable Format,可執(zhí)行與可鏈接格式。


首先,你需要知道的是所謂對象文件(Object files)有三個種類:

1)可重定向文件:文件保存著代碼和適當?shù)臄?shù)據(jù),用來和其他的目標文件一起來創(chuàng)建一個可執(zhí)行文件或者是一個共享目標文件。(目標文件或者靜態(tài)庫文件,即通常后綴為.a和.o的文件)


2)可執(zhí)行文件:文件保存著一個用來執(zhí)行的程序。(例如bash,gcc等)


3)共享目標文件:共享庫。文件保存著代碼和合適的數(shù)據(jù),用來被下連接編輯器和動態(tài)鏈接器鏈接。


二、ELF文件格式

首先,ELF文件格式提供了兩種視圖,分別是鏈接視圖和執(zhí)行視圖。


鏈接視圖是以節(jié)(section)為單位,執(zhí)行視圖是以段(segment)為單位。鏈接視圖就是在鏈接時用到的視圖,而執(zhí)行視圖則是在執(zhí)行時用到的視圖。上圖左側(cè)的視角是從鏈接來看的,右側(cè)的視角是執(zhí)行來看的??倐€文件可以分為四個部分:

  • ELF header:描述整個文件的組織。

  • Program Header Table: 描述文件中的各種segments,用來告訴系統(tǒng)如何創(chuàng)建進程映像的。

  • sections 或者 segments:segments是從運行的角度來描述elf文件,sections是從鏈接的角度來描述elf文件,也就是說,在鏈接階段,我們可以忽略program header table來處理此文件,在運行階段可以忽略section header table來處理此程序(所以很多加固手段刪除了section header table)。從圖中我們也可以看出,segments與sections是包含的關(guān)系,一個segment包含若干個section。

  • Section Header Table: 包含了文件各個segction的屬性信息,我們都將結(jié)合例子來解釋。





程序頭部表(Program Header Table),如果存在的話,告訴系統(tǒng)如何創(chuàng)建進程映像。
節(jié)區(qū)頭部表(Section Header Table)包含了描述文件節(jié)區(qū)的信息,比如大小、偏移等。

如下圖,可以通過執(zhí)行命令”readelf -S android_server”來查看該可執(zhí)行文件中有哪些section。

通過執(zhí)行命令readelf –segments android_server,可以查看該文件的執(zhí)行視圖。

這驗證了第一張圖中所述,segment是section的一個集合,sections按照一定規(guī)則映射到segment。那么為什么需要區(qū)分兩種不同視圖?

當ELF文件被加載到內(nèi)存中后,系統(tǒng)會將多個具有相同權(quán)限(flg值)section合并一個segment。操作系統(tǒng)往往以頁為基本單位來管理內(nèi)存分配,一般頁的大小為4096B,即4KB的大小。同時,內(nèi)存的權(quán)限管理的粒度也是以頁為單位,頁內(nèi)的內(nèi)存是具有同樣的權(quán)限等屬性,并且操作系統(tǒng)對內(nèi)存的管理往往追求高效和高利用率這樣的目標。ELF文件在被映射時,是以系統(tǒng)的頁長度為單位的,那么每個section在映射時的長度都是系統(tǒng)頁長度的整數(shù)倍,如果section的長度不是其整數(shù)倍,則導致多余部分也將占用一個頁。而我們從上面的例子中知道,一個ELF文件具有很多的section,那么會導致內(nèi)存浪費嚴重。這樣可以減少頁面內(nèi)部的碎片,節(jié)省了空間,顯著提高內(nèi)存利用率。

需要注意地是:盡管圖中顯示的各個組成部分是有順序的,實際上除了 ELF 頭部表以外,其他節(jié)區(qū)和段都沒有規(guī)定的順序。


三、ELF Header

首先,我們先來看下32位ELF文件中常用的數(shù)據(jù)格式:
名稱 大小 對齊 目的
Elf32_Addr 4 4 無符號程序地址
Elf32_Half 2 2 無符號中等整數(shù)
Elf32_Off 4 4 無符號文件偏移
Elf32_SWord 4 4 有符號大整數(shù)
Elf32_Word 4 4 無符號大整數(shù)
unsigned char 1 1 無符號小整數(shù)

然后我們來觀察一下ELF Header的結(jié)構(gòu)體:
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
ELF32_Half e_type;
ELF32_Half e_machine;
ELF32_Word e_version;
ELF32__Addr e_entry;
ELF32_Off e_phoff;
ELF32_Off e_shoff;
ELF32_Word e_flags;
ELF32_Half e_ehsize;
ELF32_Half e_phentsize;
ELF32_Half e_phnum;
ELF32_Half e_shentsize;
ELF32_Half e_shnum;
ELF32_Half e_shstrndx;
}Elf32_Ehdr;

e_ident :ELF的一些標識信息,前四位為.ELF,其他的信息比如大小端等
e_machine :文件的目標體系架構(gòu),比如ARM
e_version : 0為非法版本,1為當前版本
e_entry :程序入口的虛擬地址
e_phoff :程序頭部表偏移地址
e_shoff :節(jié)區(qū)頭部表偏移地址
e_flags :保存與文件相關(guān)的,特定于處理器的標志
e_ehsize :ELF頭的大小
e_phentsize :每個程序頭部表的大小
e_phnum :程序頭部表的數(shù)量
e_shentsize:每個節(jié)區(qū)頭部表的大小
e_shnum :節(jié)區(qū)頭部表的數(shù)量
e_shstrndx:節(jié)區(qū)字符串表位置

接著運行readelf -h android_server命令,可以看到ELF Header結(jié)構(gòu)的內(nèi)容。



或者使用010Editor的ELF模板也可以看到ELF Header結(jié)構(gòu)。對比以下三類ELF文件,我們得到了以下結(jié)論:

1、e_type標識了文件類型

2、Relocatable File(.o文件)不需要執(zhí)行,因此e_entry字段為0,且沒有Program Header Table等執(zhí)行視圖

3、不同類型的ELF文件的Section也有較大區(qū)別,比如只有Relocatable File有.strtab節(jié)。



Shared Object File(.so文件)

Executable File(可執(zhí)行文件android_server)

Relocatable File(.o文件)


四、Section Header Table

一個ELF文件中到底有哪些具體的 sections,由包含在這個ELF文件中的 section head table(SHT)決定。在SHT中,針對每一個section,都設置有一個條目(entry),用來描述對應的這個section,其內(nèi)容主要包括該 section 的名稱、類型、大小以及在整個ELF文件中的字節(jié)偏移位置等等。我們也可以在TISCv1.2規(guī)范中找到SHT表中條目的C結(jié)構(gòu)定義:

typedef struct{
Elf32_Word sh_name; //節(jié)區(qū)名,是節(jié)區(qū)頭部字符串表節(jié)區(qū)(Section Header String Table Section)的索引。名字是一個 NULL 結(jié)尾的字符串。
Elf32_Word sh_type; //為節(jié)區(qū)類型
Elf32_Word sh_flags; //節(jié)區(qū)標志
Elf32_Addr sh_addr; //如果節(jié)區(qū)將出現(xiàn)在進程的內(nèi)存映像中,此成員給出節(jié)區(qū)的第一個字節(jié)應處的位置。否則,此字段為 0。
Elf32_Off sh_offset; //此成員的取值給出節(jié)區(qū)的第一個字節(jié)與文件頭之間的偏移。
Elf32_Word sh_size; //此 成 員 給 出 節(jié) 區(qū) 的 長 度 ( 字 節(jié) 數(shù) )。
Elf32_Word sh_link; //此成員給出節(jié)區(qū)頭部表索引鏈接。其具體的解釋依賴于節(jié)區(qū)類型。
Elf32_Word sh_info; //此成員給出附加信息,其解釋依賴于節(jié)區(qū)類型。
Elf32_Word sh_addralign; //某些節(jié)區(qū)帶有地址對齊約束.
Elf32_Word sh_entsize; //某些節(jié)區(qū)中包含固定大小的項目,如符號表。對于這類節(jié)區(qū),此成員給出每個表項的長度字節(jié)數(shù)。
}Elf32_Shdr;

sh_type的取值如下:

名稱 取值 說明
SHT_NULL 0 此值標志節(jié)區(qū)頭部是非活動的,沒有對應的節(jié)區(qū)。此節(jié)區(qū)頭部中的其他成員取值無意義。
SHT_PROGBITS 1 此節(jié)區(qū)包含程序定義的信息,其格式和含義都由程序來解釋。
SHT_SYMTAB 2 此節(jié)區(qū)包含一個符號表。目前目標文件對每種類型的節(jié)區(qū)都只能包含一個,不過這個限制將來可能發(fā)生變化。一般,SHT_SYMTAB 節(jié)區(qū)提供用于鏈接編輯(指 ld 而言)的符號,盡管也可用來實現(xiàn)動態(tài)鏈接。
SHT_STRTAB 3 此節(jié)區(qū)包含字符串表。目標文件可能包含多個字符串表節(jié)區(qū)。
SHT_RELA 4 此節(jié)區(qū)包含重定位表項,其中可能會有補齊內(nèi)容(addend),例如 32 位目標文件中的 Elf32_Rela 類型。目標文件可能擁有多個重定位節(jié)區(qū)。
SHT_HASH 5 此節(jié)區(qū)包含符號哈希表。所有參與動態(tài)鏈接的目標都必須包含一個符號哈希表。目前,一個目標文件只能包含一個哈希表,不過此限制將來可能會解除。
SHT_DYNAMIC 6 此節(jié)區(qū)包含動態(tài)鏈接的信息。目前一個目標文件中只能包含一個動態(tài)節(jié)區(qū),將來可能會取消這一限制。
SHT_NOTE 7 此節(jié)區(qū)包含以某種方式來標記文件的信息。
SHT_NOBITS 8 這 種 類 型 的 節(jié) 區(qū) 不 占 用 文 件 中 的 空 間 , 其 他 方 面 和SHT_PROGBITS 相似。盡管此節(jié)區(qū)不包含任何字節(jié),成員sh_offset 中還是會包含概念性的文件偏移
SHT_REL 9 此節(jié)區(qū)包含重定位表項,其中沒有補齊(addends),例如 32 位目標文件中的 Elf32_rel 類型。目標文件中可以擁有多個重定位節(jié)區(qū)。
SHT_SHLIB 10 此節(jié)區(qū)被保留,不過其語義是未規(guī)定的。包含此類型節(jié)區(qū)的程序與 ABI 不兼容。
SHT_DYNSYM 11 作為一個完整的符號表,它可能包含很多對動態(tài)鏈接而言不必要的符號。因此,目標文件也可以包含一個 SHT_DYNSYM 節(jié)區(qū),其中保存動態(tài)鏈接符號的一個最小集合,以節(jié)省空間。
SHT_LOPROC 0X70000000 這一段(包括兩個邊界),是保留給處理器專用語義的。
SHT_HIPROC OX7FFFFFFF 這一段(包括兩個邊界),是保留給處理器專用語義的。
SHT_LOUSER 0X80000000 此值給出保留給應用程序的索引下界。
SHT_HIUSER 0X8FFFFFFF 此值給出保留給應用程序的索引上界。


五、Section

有些節(jié)區(qū)是系統(tǒng)預訂的,一般以點開頭號,因此,我們有必要了解一些常用到的系統(tǒng)節(jié)區(qū)。


名稱 類型 屬性 含義

.bss

SHT_NOBITS

SHF_ALLOC +
SHF_WRITE

包含將出現(xiàn)在程序的內(nèi)存映像中的為初始化數(shù)據(jù)。根據(jù)定義,當程序開始執(zhí)行,系統(tǒng)將把這些數(shù)據(jù)初始化為 0。此節(jié)區(qū)不占用文件空間。

.comment

SHT_PROGBITS

(無)

包含版本控制信息。

.data

SHT_PROGBITS

SHF_ALLOC +
SHF_WRITE

這些節(jié)區(qū)包含初始化了的數(shù)據(jù),將出現(xiàn)在程序的內(nèi)存映像中。

.data1

SHT_PROGBITS

SHF_ALLOC +
SHF_WRITE

這些節(jié)區(qū)包含初始化了的數(shù)據(jù),將出現(xiàn)在程序的內(nèi)存映像中。

.debug

SHT_PROGBITS

(無)

此節(jié)區(qū)包含用于符號調(diào)試的信息。

.dynamic

SHT_DYNAMIC


此節(jié)區(qū)包含動態(tài)鏈接信息。節(jié)區(qū)的屬性將包含 SHF_ALLOC 位。是否 SHF_WRITE 位被設置取決于處理器。

.dynstr

SHT_STRTAB

SHF_ALLOC

此節(jié)區(qū)包含用于動態(tài)鏈接的字符串,大多數(shù)情況下這些字符串代表了與符號表項相關(guān)的名稱。

.dynsym

SHT_DYNSYM

SHF_ALLOC

此節(jié)區(qū)包含了動態(tài)鏈接符號表。

.fini

SHT_PROGBITS

SHF_ALLOC +
SHF_EXECINSTR

此節(jié)區(qū)包含了可執(zhí)行的指令,是進程終止代碼的一部分。程序正常退出時,系統(tǒng)將安排執(zhí)行這里的代碼。

.got

SHT_PROGBITS


此節(jié)區(qū)包含全局偏移表。

.hash

SHT_HASH

SHF_ALLOC

此節(jié)區(qū)包含了一個符號哈希表。

.init

SHT_PROGBITS

SHF_ALLOC +
SHF_EXECINSTR

此節(jié)區(qū)包含了可執(zhí)行指令,是進程初始化代碼的一部分。當程序開始執(zhí)行時,系統(tǒng)要在開始調(diào)用主程序入口之前(通常指 C 語言的 main 函數(shù))執(zhí)行這些代碼。

.interp

SHT_PROGBITS


此節(jié)區(qū)包含程序解釋器的路徑名。如果程序包含一個可加載的段,段中包含此節(jié)區(qū),那么節(jié)區(qū)的屬性將包含 SHF_ALLOC 位,否則該位為 0。

.line

SHT_PROGBITS

(無)

此節(jié)區(qū)包含符號調(diào)試的行號信息,其中描述了源程序與機器指令之間的對應關(guān)系。其內(nèi)容是未定義的。

.note

SHT_NOTE

(無)

此節(jié)區(qū)中包含注釋信息,有獨立的格式。

.plt

SHT_PROGBITS


此節(jié)區(qū)包含過程鏈接表(procedure linkage table)。

.relname
.relaname

SHT_REL
SHT_RELA


這些節(jié)區(qū)中包含了重定位信息。如果文件中包含可加載的段,段中有重定位內(nèi)容,節(jié)區(qū)的屬性將包含 SHF_ALLOC 位,否則該位置 0。傳統(tǒng)上 name 根據(jù)重定位所適用的節(jié)區(qū)給定。例如 .text 節(jié)區(qū)的重定位節(jié)區(qū)名字將是:.rel.text 或者 .rela.text。

.rodata
.rodata1

SHT_PROGBITS

SHF_ALLOC

這些節(jié)區(qū)包含只讀數(shù)據(jù),這些數(shù)據(jù)通常參與進程映像的不可寫段。

.shstrtab

SHT_STRTAB


此節(jié)區(qū)包含節(jié)區(qū)名稱。

.strtab

SHT_STRTAB


此節(jié)區(qū)包含字符串,通常是代表與符號表項相關(guān)的名稱。如果文件擁有一個可加載的段,段中包含符號串表,節(jié)區(qū)的屬性將包含SHF_ALLOC 位,否則該位為 0。

.symtab

SHT_SYMTAB


此節(jié)區(qū)包含一個符號表。如果文件中包含一個可加載的段,并且該段中包含符號表,那么節(jié)區(qū)的屬性中包含SHF_ALLOC 位,否則該位置為 0。

.text

SHT_PROGBITS

SHF_ALLOC +
SHF_EXECINSTR

此節(jié)區(qū)包含程序的可執(zhí)行指令。


六、Program Header Table

程序頭部(Program Header)描述與程序執(zhí)行直接相關(guān)的目標文件結(jié)構(gòu)信息。用來在文件中定位各個段的映像。同時包含其他一些用來為程序創(chuàng)建映像所必須的信息。
可執(zhí)行文件或者共享目標文件的程序頭部是一個結(jié)構(gòu)數(shù)組,每個結(jié)構(gòu)描述了一個段或者系統(tǒng)準備程序執(zhí)行所必須的其他信息。目標文件的“段”包含一個或者多個“節(jié)區(qū)”,也就是“段內(nèi)容(Segment Contents)”。程序頭部僅對可執(zhí)行文件和共享目標文件有意義。

程序頭部的數(shù)據(jù)結(jié)構(gòu)如下:

typedef struct {  
Elf32_Word p_type; //此數(shù)組元素描述的段的類型,或者如何解釋此數(shù)組元素的信息。
Elf32_Off p_offset; //此成員給出從文件頭到該段第一個字節(jié)的偏移
Elf32_Addr p_vaddr; //此成員給出段的第一個字節(jié)將被放到內(nèi)存中的虛擬地址
Elf32_Addr p_paddr; //此成員僅用于與物理地址相關(guān)的系統(tǒng)中。System V忽略所有應用程序的物理地址信息。
Elf32_Word p_filesz; //此成員給出段在文件映像中所占的字節(jié)數(shù)。可以為0。
Elf32_Word p_memsz; //此成員給出段在內(nèi)存映像中占用的字節(jié)數(shù)??梢詾?。
Elf32_Word p_flags; //此成員給出與段相關(guān)的標志。
Elf32_Word p_align; //此成員給出段在文件中和內(nèi)存中如何對齊。
} Elf32_phdr;

p_type:

名稱 取值 說明
PT_NULL 0 此數(shù)組元素未用。結(jié)構(gòu)中其他成員都是未定義的。
PT_LOAD 1 此數(shù)組元素給出一個可加載的段,段的大小由 p_filesz 和 p_memsz描述。文件中的字節(jié)被映射到內(nèi)存段開始處。如果 p_memsz 大于p_filesz,“剩余”的字節(jié)要清零。p_filesz 不能大于 p_memsz??杉虞d的段在程序頭部表格中根據(jù) p_vaddr 成員按升序排列。
PT_DYNAMIC 2 數(shù)組元素給出動態(tài)鏈接信息。
PT_INTERP 3 數(shù)組元素給出一個 NULL 結(jié)尾的字符串的位置和長度,該字符串將被當作解釋器調(diào)用。這種段類型僅對與可執(zhí)行文件有意義(盡管也可能在共享目標文件上發(fā)生)。在一個文件中不能出現(xiàn)一次以上。如果存在這種類型的段,它必須在所有可加載段項目的前面。
PT_NOTE 4 此數(shù)組元素給出附加信息的位置和大小。
PT_SHLIB 5 此段類型被保留,不過語義未指定。包含這種類型的段的程序與 ABI不符。
PT_PHDR 6 此類型的數(shù)組元素如果存在,則給出了程序頭部表自身的大小和位置,既包括在文件中也包括在內(nèi)存中的信息。此類型的段在文件中不能出現(xiàn)一次以上。并且只有程序頭部表是程序的內(nèi)存映像的一部分時才起作用。如果存在此類型段,則必須在所有可加載段項目的前面。
PT_LOPROC~
PT_HIPROC
0x70000000~
0x7fffffff
此范圍的類型保留給處理器專用語義。


好了,本文主要內(nèi)容就分享到這里,具體可以參看ELF文件詳細描述。


推薦閱讀:

C++中字符編碼的轉(zhuǎn)換

手把手教你用STM32Trust生成加密固件

FreeRTOS如何減少RAM占用空間并加快執(zhí)行速度


關(guān)注 微信公眾號『strongerHuang』,后臺回復“1024”查看更多內(nèi)容,回復“加群”按規(guī)則加入技術(shù)交流群。


長按前往圖中包含的公眾號關(guān)注

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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