有了這個功能:如何解釋x86-64上的段寄存器訪問?
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
如何解釋的第二個指令,並找出加入RAX?
有了這個功能:如何解釋x86-64上的段寄存器訪問?
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
如何解釋的第二個指令,並找出加入RAX?
此代碼:
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
返回一個線程局部變量的地址。 %fs:0x0
是TCB(線程控制塊)的地址,並且1069833(%rip)
是從那裏到變量的偏移量,這是已知的,因爲該變量駐留在程序或加載時的某個動態庫中(運行時加載的庫通過dlopen()
需要一些不同的代碼)。
這是非常詳細烏利齊·德雷珀的TLS document解釋,特別是第4.3節和§4.3.6。
我不知道,因爲分段架構的壞日子,他們一直叫段寄存器。我相信適當的術語是一個選擇器(但我可能是錯的)。
不過,我認爲你只需要在fs
區第一四字(64位)。
的%fs:0x0
位表示存儲器的內容在fs:0
。既然您已經使用了通用的add
(而不是addl
),我認爲它會從目標%rax
獲取數據寬度。
在獲取實際價值方面,取決於您是處於傳統模式還是長時間模式。
在傳統模式下,您必須獲取fs
的值並在GDT(或可能是LDT)中查找它以獲取基地址。
在長模式下,您需要查看相關型號的特定寄存器。如果您現在處於這種狀態,那麼您不幸的是已經超出了我的專業水平。
我想通作爲很多,但我如何從選擇器獲取實際地址?我沒有一個正在運行的進程,只有一個核心轉儲。 –
恐怕我處於長時間模式。 –
是的,選擇器是索引(包括其他內容,如指定LDT/GDT的標誌)。你必須知道GDT/LDT在哪裏,而且我並不完全確定你可以從註冊信息中獲得這些信息。 – paxdiablo
Assming你在linux下運行,[這](http://stackoverflow.com/questions/6611346/amd64-fs-gs-registers-in-linux)的問題可能是相關的。 – user786653
的可能的複製[ 「DS:\ [40207A \]」?是什麼在組裝的意思(http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly) –