2

以下代码来自u-boot:

        /* Initialize GOT pointer.
        ** Global symbols can't be resolved before this is done, and as such we can't
        ** use any global symbols in this code.  We use the bal/ move xxx,ra combination to access
        ** data in a PC relative manner to avoid this.  This code will correctly set the
        ** gp regardless of whether the code has already been relocated or not.                                                          
        ** This code determines the current gp by computing the link time (gp - pc)                                                      
        ** and adding this to the current pc.                                                                                            
        ** runtime_gp = runtime_pc + (linktime_gp - linktime_pc)                                                                         
        ** U-boot is running from the address it is linked at at this time, so this                                                      
        ** general case code is not strictly necessary here.                                                                             
        */                                                                                                                               

/*Branch and link to get current PC in ra */                                                                                     
        bal     1f                                                                                                     
        nop                                                                                               
        .extern _GLOBAL_OFFSET_TABLE_                                            
        .word   _GLOBAL_OFFSET_TABLE_  /* This contains the linked address of the GOT */                                                 
        /* The ra register now contains the runtime address of the above memory location */                                              

        .word   . - 4                  /* This contains the link time address of the previous word,                                      
                                        which is also what the link time expected PC value is */                                         
1:                                                                                                
        move    gp, ra    /* Move current PC into gp register */                                                                         
        lw      a5, 0(ra) /* Load linked address of the GOT into a5 */                                                                   
        lw      a6, 4(ra) /* Load the link time address of the GOT storage location into a6 */                                           
        sub     a5, a6    /* Subtract a6 from t1. */                                                                                     
        /* a5 now contains the difference between the link-time GOT table address and the link time expected PC */                       

        /* Add this difference to the current PC (copied into gp above) so that gp now has the current runtime                           
        ** GOT table address */                                                                                                          
        daddu   gp, a5  # calculate current location of offset table              

我不明白上面的 3 个指令:

.extern _GLOBAL_OFFSET_TABLE_
.word _GLOBAL_OFFSET_TABLE_ //what the meaning after declaring it as a external symbol?
.word . -4  //and also this one?

TIA

4

1 回答 1

2
.extern _GLOBAL_OFFSET_TABLE_

该符号在此编译单元之外进行描述。在链接时解决它。

.word _GLOBAL_OFFSET_TABLE_

分配一个字的内存并将符号的地址放在这个位置

.word . - 4

取当前位置 ,.减去 4 并将该值放入内存中。与前面的代码类似,只是正在计算放置在此位置的值。

这是一个包含许多汇编器指令列表的链接

于 2011-03-02T15:25:06.850 回答