2014-09-04 145 views
0

我想在啓動時找到位於AArch64中_GLOBAL_OFFSET_TABLE_ [0]上的_DYNAMIC結構偏移量,並且尚未重新定位GOT項目。從全局偏移量表中查找負載偏移量

我在程序集中編寫代碼。

ldr  x2, [x2] 

我在做什麼錯在這裏:

.text 
    .globl _start 
    .type _start,%function 

_start: 
     mov  x0, sp 
     sub  sp, sp, #132 

     /* Find our load offset at GOT[0] */ 
     ldr  x1, .Lpool 
.LPIC0: add  x1, x1, .LPIC0 // x1=address of _DYNAMIC 
     ldr  x2, .Lpool+4 
     add  x2, x2, .LPIC0 // x2=address of GOT 
     ldr  x2, [x2]  // x2=GOT[0] 
     sub  x1, x1, x2  // load offset of _DYNAMIC 

     bl  my_function 

     ldr  x1, [sp] 
     mov  sp, x1 
     br  x0 

     .align 2 
.Lpool: .word _DYNAMIC-.LPIC0 
     .word _GLOBAL_OFFSET_TABLE_-.LPIC0 

     .size _start,.-_start 

當我運行的代碼我得到段錯誤,在下面的代碼行(調試節目)?

在此先感謝。

+0

每條評論都會幫助你更快地回答你的問題。就目前而言,缺少評論是對那些想要幫助你的人的障礙。 – 2014-09-04 10:48:46

+0

你有沒有試過在這段代碼中使用調試器? – 2014-09-04 10:50:37

+0

@ User.1當然,我添加了有用的評論。 – 2014-09-04 11:08:00

回答

0

我能夠寫出正確的代碼來加載AArch64中得到的表的偏移量。 以下是代碼。

/* Find our load offset at GOT[0] */ 
    adrp x1, _DYNAMIC 
    add  x1, x1,#:lo12:_DYNAMIC \\ address of _DYNAMIC 

    adrp x2, _GLOBAL_OFFSET_TABLE_ 
    ldr  x2, [x2,#:lo12:_GLOBAL_OFFSET_TABLE_] \\GOT[0] 

    sub  x1, x1, x2 
1

AArch64地址是64位,ldr x讀取64位,但您的.word只有32位。這導致地址全部錯誤。

增加池中字段的大小,並使用+8加載第二個值。

在任何情況下,爲了允許大於2G的程序,您應該使用64位偏移量。

您可能還想重新考慮用什麼模式加載GOT [0]。 ldr w2, [x2]可能是對的,但您必須確認。

+0

尋求幫助。並指出想想64位地址。 – 2014-09-05 13:00:29