自我修養(yǎng)-動態(tài)鏈接

1.為什么動態(tài)鏈接

  • 靜態(tài)鏈接導致同一模塊在多個進程中使用恬偷,在內(nèi)存中存在多個副本悍手,造成空間浪費。
  • 靜態(tài)鏈接給程序的更新袍患、部署和發(fā)布造成麻煩坦康。

動態(tài)鏈接的基本實現(xiàn)

基本思想是把程序按照模塊拆分成各個相對獨立的部分,在程序運行的時候才將它們鏈接在一起形成一個完整的程序诡延。

  • Linux系統(tǒng)中滞欠,ELF動態(tài)鏈接文件被稱為動態(tài)共享對象(DSO Dynamic Shared Objects)簡稱共享對象,一般以.so為拓展名肆良。

  • Windows系統(tǒng)中筛璧,動態(tài)鏈接文件被稱為動態(tài)鏈接庫(Dynamical Linking Library),即DLL文件

  • Linux中,常用的C語言庫的運行庫glibc惹恃,它的動態(tài)鏈接形式的版本保存在/lib目錄下夭谤,文件名為libc.so。所有的C語言編寫的巫糙、動態(tài)鏈接程序都可以在運行時使用它朗儒。

2.簡單的動態(tài)鏈接例子

  1. 創(chuàng)建以下文件
// dlib.c
#include<stdio.h>
void fooBar(int i){
    print("echo from %d\n",i);
}
///test1.c
int main(){
    fooBar(1);
    return 0;
}
  1. 使用GCC將dlib.c編譯成一個共享對象文件
    gcc -fPIC -shared -o MyLib.so dlib.c
  2. 然后我們鏈接test1.c文件
    gcc -o test1 test1.c ./MyLib.so

如果在dlib.c中的fooBar函數(shù)中寫入sleep(-1);然后
./test1 &
查看PID,接著就可以查看進程的虛擬地址空間分布
cat /proc/12985/maps
kill 12985
我們還可以通過readelf工具查看MyLib.so的裝載特性参淹。
readelf -l MyLib.so

  • 有一點和普通程序不一樣的地方是:動態(tài)鏈接模塊的裝載地址是從0x00000000開始的醉锄。我們知道這個地址是無效地址,并且從得到的進程的虛擬空間分布看到浙值,MyLib.so的最終裝載地址并不是0x00000000.從這一點可以看到恳不,共享對象的最終裝載地址在編譯時時不確定的

3.地址無關(guān)代碼技術(shù)

裝載時重定位

在鏈接時,對所有絕對地址的引用不作重定位开呐,而把這一步推遲到裝載時在完成烟勋。一旦模塊裝載地址確定,即目標地址確定负蚊,那么系統(tǒng)就對程序所有的絕對地址引用進程重定位神妹。
靜態(tài)鏈接時提到過重定位叫做鏈接時重定位。現(xiàn)在這種情況被稱為裝載時重定位家妆,在Windows中鸵荠,這種裝載時重定位被稱作基址重置

地址無關(guān)代碼

裝載時重定位時解決動態(tài)模塊中有絕對地址引用的辦法之一伤极,但它有一個很大的缺點就是指令部分無法在多個進程之間共享蛹找,這樣就失去了動態(tài)鏈接節(jié)省內(nèi)存的一大優(yōu)勢姨伤。
目的:程序模塊中共享的指令部分在裝載時不需要因為裝載地址的改變而改變。
基本想法:把指令部分需要被修改的部分分離出來庸疾,跟數(shù)據(jù)部分放一起乍楚,這樣指令部分就可以保持不變,而數(shù)據(jù)部分可以在每個進程中擁有一個副本届慈。這種方案被稱為地址無關(guān)代碼(PIC,
Position Independent Code)徒溪。
模塊中各種地址引用方式可以分為以下幾種:

  • 模塊內(nèi)部函數(shù)調(diào)用、跳轉(zhuǎn)等金顿。
  • 模塊內(nèi)部的數(shù)據(jù)訪問臊泌。
  • 模塊外部的函數(shù)調(diào)用、跳轉(zhuǎn)等揍拆。
  • 模塊外部的數(shù)據(jù)訪問渠概。
類型一 模塊內(nèi)部調(diào)用或跳轉(zhuǎn)

模塊內(nèi)部的跳轉(zhuǎn)、函數(shù)調(diào)用都可以是相對地址調(diào)用嫂拴,或者是基于寄存器的相對調(diào)用播揪,所以對于這種指令是不需要重定位的。

類型二 模塊內(nèi)部數(shù)據(jù)訪問

指令中不能直接包含數(shù)據(jù)的絕對地址筒狠,那么唯一的辦法就是相對尋址猪狈。

類型三 模塊間數(shù)據(jù)訪問

模塊間的數(shù)據(jù)訪問目標地址要等到裝載時才決定。ELF的做法是在數(shù)據(jù)段里面建立一個指向這些變量的指針數(shù)組窟蓝,也被稱為全局偏移表(GlobalOffsetTable,GOT)罪裹,當代碼需要引用該全局變量時,可以通過GOT中相對的項間接引用运挫。

類型四 模塊間調(diào)用、跳轉(zhuǎn)

GOT中相應的項保存的是目標函數(shù)的地址套耕,當模塊要調(diào)用目標函數(shù)時谁帕,可以通過GOT中的項進行間接跳轉(zhuǎn)。

如何區(qū)分一個DSO是否為PIC

readelf -d MyLib.so |grep TEXTREL

PIE

一個以地址無關(guān)方式編譯的可執(zhí)行文件稱為地址無關(guān)可執(zhí)行文件(PIE,Position-Independent-Executable).
GCC產(chǎn)生PIE的參數(shù)為-fPIE或者-fpie

-fPIC和-fpic

-fPIC和-fpic從功能上講完全一樣冯袍,但是-fPIC產(chǎn)生的代碼大匈挖,但是沒有在平臺上的限制,而-fpic產(chǎn)生的代碼小康愤,而且較快儡循,但是在某些平臺上會有限制。所以常用-fPIC

延遲綁定

動態(tài)鏈接有很多優(yōu)勢征冷,比靜態(tài)鏈接要靈活择膝,但它犧牲了一部分性能代價。
動態(tài)鏈接比靜態(tài)鏈接慢的主要原因是動態(tài)里鏈接對于全局和靜態(tài)的數(shù)據(jù)訪問都要進行復雜的GOT定位检激,然后間接尋址肴捉;對于模塊間的調(diào)用也要線定位GOT腹侣,然后進行跳轉(zhuǎn)。另一個減慢運行速度的原因是動態(tài)鏈接工作運行時完成齿穗,程序開始執(zhí)行時傲隶,動態(tài)鏈接器都要進行一次鏈接。
在一個程序運行過程中窃页,很多函數(shù)在程序執(zhí)行完時都不會被用到跺株,如果一開始把所有函數(shù)都鏈接好實際是一種浪費。所有ELF采用一種叫做延遲綁定的做法脖卖,基本思想:當函數(shù)第一次被用到時才進行綁定乒省,如果不用到,則不綁定胚嘲。
ELF使用PLT(Procedure Linkage Table)的方法來實現(xiàn)作儿。
調(diào)用函數(shù)并不直接通過GOT跳轉(zhuǎn),而是通過一個叫做PLT項結(jié)構(gòu)來進行跳轉(zhuǎn)。每個外部函數(shù)在PLT中都有一個相對于的項膘壶,比如bar()函數(shù)在PLT中的項的地址我們稱為bar@plt饲趋。
bar@plt實現(xiàn):

bar@plt:

jmp *(bar@GOT)//通過GOT間接跳轉(zhuǎn)的指令.連接器初始化階段并沒有將bar()地址填入該項,而是將下面的代碼地址填入
push n//將決議符號下標壓入堆棧
push moduleID//將模塊ID壓入堆棧
jump _dl_runtime_resolve//調(diào)用鏈接器_dl_runtime_resolve函數(shù)來完成符號解析和重定位工作
  • ELF將GOT拆分成兩張表叫做”.got”和”.got.plt”娶吞。
    “.got”用來保存全局變量引用地址
    “.got.plt”用來保存函數(shù)引用地址

.got.plt 表中,前三項分別是

  • .dynamic 段的地址
  • 本模塊的 ID
  • _dl_runtime_resolve()的地址

與動態(tài)鏈接相關(guān)結(jié)構(gòu)

.interp段

  • 動態(tài)鏈接器的位置由ELF可執(zhí)行文件決定。在動態(tài)鏈接的ELF可執(zhí)行文件中械姻,有一個專門的段叫做”.interp”段妒蛇。
  • “.interp”段的內(nèi)容很簡單,里面保存的就是一個字符串楷拳,這個字符串就是可執(zhí)行文件所需要的動態(tài)鏈接器路徑(通常實際上是一個軟鏈接)绣夺。
    動態(tài)鏈接器在Linux下是Glibc的一部分,也就是屬于系統(tǒng)庫級別欢揖。
  • 可以使用objdump -s a.out查看.interp的內(nèi)容
  • 還可以使用objdump -l a.out | grep interpreter查看可執(zhí)行文件所需要的動態(tài)鏈接器的路徑陶耍。

.dynamic段

  • 是動態(tài)鏈接ELF中最重要的結(jié)構(gòu),這個段里面保存了動態(tài)鏈接器所有需要的基本信息她混,比如:依賴與那些共享對象烈钞、動態(tài)鏈接符號表的位置、動態(tài)鏈接重定位表的位置坤按、共享對象初始化代碼的地址等毯欣。

  • “.dynamic”段可以看成動態(tài)鏈接下ELF文件的“文件頭”。

  • 使用readelf -d MyLib.so可以查看“.dynamic”段的內(nèi)容

  • 另在Linux還提供了ldd命令還查看一個程序主模塊或一個共享庫依賴于哪些共享庫臭脓。

$ ldd program

動態(tài)符號表

.dynsym 段

該段與 “.symtab”段類似酗钞,但只保存了與動態(tài)鏈接相關(guān)的符號,很多時候,ELF文件同時擁有 .symtab 與 .synsym段算吩,其中 .symtab 將包含 .synsym 中的符號留凭。該符號表中記錄了動4 .dynstr 段

該段是 .dynsym 段的輔助段,.dynstr 與 .dynsym 的關(guān)系偎巢,類比與 .symtab 與 .strtab 的關(guān)系

.dynstr 段

(動態(tài)符號字符串表)蔼夜,用于保存符號名的字符串表。
靜態(tài)鏈接時叫做符號字符表(.strtab)压昼。

.hash 段

在動態(tài)鏈接下求冷,需要在程序運行時查找符號,為了加快符號查找過程窍霞,增加了輔助的符號哈希表(.hash)

  • 可以使用readelf -sD MyLib.so查看ELF文件的動態(tài)符號表和哈希表

動態(tài)鏈接重定位表

共享對象需要重定位的主要原因是導入符號的存在匠题。
在動態(tài)鏈接中,導入符號的地址在運行時才確定但金,所以需要在運行時將這些導入符號引用修正韭山,即需要重定位。

動態(tài)鏈接重定位相關(guān)結(jié)構(gòu)

在動態(tài)鏈接的文件中冷溃,也有和靜態(tài)文件類似的重定位的表钱磅,分別叫做”.rel.dyn”和”.rel.plt”

動態(tài)鏈接時進程堆棧初始化信息

當操作系統(tǒng)將控制權(quán)交給動態(tài)鏈接器時,它需要知道可執(zhí)行文件和本進程的一些信息似枕,這些信息由操作系統(tǒng)傳遞給動態(tài)鏈接器盖淡,保存在進程的堆棧里面。
堆棧里面還保存了一些輔助信息數(shù)組

操作系統(tǒng)傳遞給動態(tài)鏈接器的輔助信息有4個:(例)

  • AT_PHDR凿歼,值為0x08048034褪迟,程序表頭位于0x08048034
  • AT_PHENT,值為20答憔,程序表頭中每個項的大小為20字節(jié)
  • AT_PHNUM味赃,值為7,程序表頭共有7個項
  • AT_ENTRY虐拓,0x08048320洁桌,程序入口地址為0x08048320

動態(tài)鏈接的步驟和實現(xiàn)

動態(tài)鏈接基本上分為3步:先是啟動動態(tài)鏈接器本身,然后裝載所有需要的共享對象侯嘀,最后重定位和初始化。

1.動態(tài)鏈接器自舉

2.裝載共享對象

完成基本自舉后谱轨,動態(tài)鏈接器將可執(zhí)行文件和鏈接器本身的符號表都合并到一個符號表中戒幔,我們稱為全局符號表。然后鏈接器開始尋找可執(zhí)行文件所依賴的共享對象土童。在”.dynamic”段中诗茎,類型入口DT_NEEDED,它所指出的是該可執(zhí)行文件所依賴的共享對象。鏈接器可以列出可執(zhí)行文件所需要的所有共享對象敢订,并將這些共享對象的名字放入一個裝載集合中王污。然后鏈接器開始從集合里取一個所需要的共享對象名字,找到相對應的文件后打開該文件楚午,讀取相應的ELF文件頭和”.dynalic”段昭齐,然后將它相應的代碼段和數(shù)據(jù)段映射到進程空間。
當一個新的共享對象被裝載進來的時候矾柜,它的符號表會被合并到全局符號表中阱驾,所以當所有共享對象都被裝載進來的時候,全局符號表里面將包含進程中所有的動態(tài)鏈接器所需要的符號怪蔑。

符號的優(yōu)先級

兩個不同模塊定義了同一個符號會怎么樣里覆?
當一個共享對象里面的全局符號被另一個共享對象的同名全局符號覆蓋的現(xiàn)象稱為共享對象全局符號介入
全局符號介入這個問題缆瓣,在Linux下動態(tài)鏈接器是這樣處理的:它定義了一個規(guī)則喧枷,那就是當一個符號需要被加入全局符號表時,如果相同的符號名已經(jīng)存在弓坞,則后加入的符號被忽略隧甚。

重定位和初始化

當上面的步驟完成后,鏈接器開始重新遍歷可執(zhí)行文件和每個共享對象的重定位表昼丑,將它們的GOT/PLT中每個需要重定位的位置進行修正呻逆。

重定位完成之后,如果某個共享對象有”.init”段菩帝,那么動態(tài)鏈接器會執(zhí)行”.init”段中代碼咖城,用以實現(xiàn)共享對象特有的初始化過程。共享對象中可能還有”.finit”段呼奢,當進程退出時宜雀,會執(zhí)行”.finit”段中的代碼,可以用來實現(xiàn)類似C++全局對象析構(gòu)之類的操作握础。
如果進程的可執(zhí)行文件也有”.init”段辐董,那么動態(tài)鏈接器不會執(zhí)行它,因為可執(zhí)行文件中”.init”段和”.finit”段由程序初始化部分代碼負責執(zhí)行禀综。

Linux動態(tài)鏈接器實現(xiàn)

  • 內(nèi)核在裝載完ELF可執(zhí)行文件以后就返回到用戶空間简烘,將控制權(quán)交給程序的入口。
  • 對于動態(tài)鏈接器的可執(zhí)行文件定枷,內(nèi)核會分析它的動態(tài)鏈接器地址孤澎,將動態(tài)鏈接器映射至進程地址空間,然后把控制權(quán)交給動態(tài)鏈接器欠窒。
  • Linux動態(tài)鏈接器本身就是一個共享對象覆旭。共享對象其實也就是ELF文件,它也有跟可執(zhí)行文件一樣的ELF文件頭。動態(tài)鏈接器是個非常特殊的共享對象型将,它不僅是個共享對象寂祥,還是個可執(zhí)行的程序。
  • Linux的內(nèi)核在執(zhí)行execve()時不關(guān)心目標ELF文件是否可執(zhí)行七兜,它只是簡單按照程序頭表里面的描述對文件進行裝載然后把控制權(quán)交給ELF入口地址丸凭。
  • windows系統(tǒng)中的EXE和DLL也是類似的區(qū)別,DLL也可以被當作程序來運行惊搏,WINDOWS提供一個叫做rundll32.exe的工具可以把一個DLL當作可執(zhí)行文件運行贮乳。
  • 動態(tài)鏈接器本身應該是靜態(tài)鏈接的,它不能依賴于其他共享對象恬惯,動態(tài)鏈接器本身是用來幫助其他ELF文件解決共享對象依賴問題的向拆。

顯示運行時鏈接

支持動態(tài)鏈接的系統(tǒng)往往都支持一種更加靈活的模塊加載方式,叫做顯示運行時鏈接酪耳,有時候也叫做運行時加載浓恳。
一般的共享對象不需要進行任何修改就可以進行運行時裝載,這種共享對象往往叫做動態(tài)轉(zhuǎn)載庫碗暗。

動態(tài)庫實際上跟一般的共享對象沒有區(qū)別颈将。主要區(qū)別是共享對象是由動態(tài)鏈接器在程序啟動之前負責裝載和鏈接的,這一系列步驟都由動態(tài)連接器自動完成言疗,對于程序是透明的晴圾。而動態(tài)庫的裝載則是通過一系列由動態(tài)鏈接器提供的API,具體地講共有4個函數(shù):打開動態(tài)庫(dlpen)噪奄,查找符號(dlsym)死姚,錯誤處理(dlerror),關(guān)閉動態(tài)庫(dlclose)勤篮,程序可以通過這幾個API對動態(tài)庫進行操作都毒。

dlopen()

void * dlopen(const char *filename,int flag)

  • 第一個參數(shù)是被加載動態(tài)庫的路徑
  • 第二個參數(shù)flag表示函數(shù)符號的加載方式,常量RTLD_LAZY表示使用延遲綁定碰缔,即PLT機制账劲;常量RTLD_NOW表示當模塊被加載時即完成所有的函數(shù)的綁定工作〗鹇眨或者RTLD_GLOBAL可以和前面的兩個常量一起用(用或操作)瀑焦,表示將被加載的模塊的全局符號合并到進程的全局符號表中。
  • dlopen()函數(shù)用來打開一個動態(tài)庫梗肝,并將其加載到進程的地址空間蝠猬,完成初始化過程。返回被加載模塊的舉兵统捶,這個句柄在后面使用dlsym()或者dlclose()的時候會用到。如果模塊及加載失敗,則返回NULL

dlsym()

void * dlsym(void *handle,char *symbol);

  • handle是dlopen返回的句柄
  • symbol是要查找的符號的名字喘鸟,以\0結(jié)尾的C字符串
    dlsym函數(shù)基本上是運行時裝載的核心部分匆绣,可以通過這個函數(shù)找到所需要的符號。

dlerror()

每次調(diào)用dlopen()什黑,dlsym()崎淳,dlclose(),以后愕把,我們都可以調(diào)用dlerror()函數(shù)來判斷上次調(diào)用是否成功拣凹。

dlclose()

dlclose()的作用跟dlopen()剛好相反,它的作用是將一個已經(jīng)加載的模塊卸載恨豁。系統(tǒng)會維持一個加載引用計數(shù)器嚣镜,每次使用dlopen()加載某模塊時,相應的的計數(shù)器加一橘蜜;每次使用dlclose()卸載模塊時菊匿,相應的計算器減一。只有當計數(shù)器減到0時计福,模塊才被真正卸載掉跌捆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市象颖,隨后出現(xiàn)的幾起案子佩厚,更是在濱河造成了極大的恐慌,老刑警劉巖说订,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抄瓦,死亡現(xiàn)場離奇詭異,居然都是意外死亡克蚂,警方通過查閱死者的電腦和手機闺鲸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃叭,“玉大人摸恍,你說我怎么就攤上這事〕辔荩” “怎么了立镶?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長类早。 經(jīng)常有香客問我媚媒,道長,這世上最難降的妖魔是什么涩僻? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任缭召,我火速辦了婚禮栈顷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嵌巷。我一直安慰自己萄凤,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布搪哪。 她就那樣靜靜地躺著靡努,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晓折。 梳的紋絲不亂的頭發(fā)上惑朦,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音漓概,去河邊找鬼漾月。 笑死,一個胖子當著我的面吹牛垛耳,可吹牛的內(nèi)容都是我干的栅屏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼堂鲜,長吁一口氣:“原來是場噩夢啊……” “哼栈雳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缔莲,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤哥纫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痴奏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛀骇,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年读拆,在試婚紗的時候發(fā)現(xiàn)自己被綠了擅憔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡檐晕,死狀恐怖暑诸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辟灰,我是刑警寧澤个榕,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站芥喇,受9級特大地震影響西采,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜继控,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一械馆、第九天 我趴在偏房一處隱蔽的房頂上張望胖眷。 院中可真熱鬧,春花似錦狱杰、人聲如沸瘦材。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朗和,卻和暖如春错沽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眶拉。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工千埃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忆植。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓放可,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朝刊。 傳聞我的和親對象是個殘疾皇子耀里,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 感賞兒子按時回家。 感賞兒子自己去理發(fā)拾氓,他會注意自己的形象的冯挎。 投射孩子早日醒悟,早睡早起咙鞍,開啟自己的正常生活房官。
    風景_6b35閱讀 110評論 0 0
  • 最近好像脾氣越來越暴躁,總是莫名其妙對身邊的人發(fā)脾氣续滋,對一些微不足道的小事斤斤計較翰守,可能是空余的時間太多,生活太過...
    北木向南閱讀 156評論 0 0
  • 彬換了新手機號疲酌,正巧靈和同事正在日本參加時裝周蜡峰,順手給她的靈哥哥發(fā)了條匿名短信:“老板,需要特殊服務嗎徐勃?” 靈沒理...
    汐鹿生銀靈閱讀 238評論 0 0
  • 2018年8月12號事示,星期日,晴僻肖。 今天算起來肖爵,已經(jīng)是離開家的第三天了,心中有過很多起起伏伏臀脏,比如說現(xiàn)在很想吃家里...
    楓郁樰閱讀 136評論 0 1
  • 作家李楓微博公開聲明曾遭郭敬明騷擾、性侵犯秒啦,受害者還有簽約到郭敬明公司的男作者及公司男性職員熬粗,并呼吁社會各界的網(wǎng)友...
    喵了個說職場閱讀 325評論 4 2