用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
ADRL
伪指令
与
ADR
指令相似。ADRL
所加载的地址比
ADR
所加载的地址更宽,因为它可生成两个数据处理指令。
Note
汇编版本老于
ARMv6T2
的处理器的
Thumb
指令时,ADRL
是无效的。
语法
ADRL{cond}
Rd,label
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
Rd
是要加载的寄存器。
label
表达式,与程序或寄存器相关。
有关详细信息,请参阅相对寄存器和程序相对的表达式。
用法
ADRL
始终汇编为两个
32
位指令。
即使使用单个指令就可完成地址访问,也会生成多余的第二个地址。
如果汇编程序无法将地址构建为两个指令,则它将生成一条错误消息,汇编将失败。
有关加载更宽范围地址的信息,请参阅LDR
伪指令(另请参阅将常数加载到寄存器)。
ADRL
可生成与位置无关的代码,因为地址与程序或寄存器有关。
如果
label
与程序有关,则其表示的地址必须要与
ADRL
伪指令在同一汇编程序区域内,请参阅AREA。
如果使用
ADRL
来为
BX
或
BLX
指令生成目标,则当目标中包含
Thumb
指令时,您就要自己设置地址的
Thumb
位(位
0)。
体系结构和范围
可用范围取决于所用的指令集:
ARM
±64KB
到字节或半字对齐的地址。
±256KB
字节,字对齐地址。
32
位
Thumb
±1MB
字节,字节、半字或字对齐地址。
16
位
Thumb
ADRL
不可用。
上面给出的范围是相对于位于当前指令后的、离当前指令有四个字节(在
Thumb
代码中)或两个字(在
ARM
代码中)间隔的点而言的。
在
ARM
和
32
位
Thumb
中,如果地址为
16
字节对齐,或与该点的相对性更高,则相对地址的范围可更大。
MOV32
伪指令
将以下项之一加载到寄存器:
一个
32
位常数值
任何地址。
MOV32
始终会生成两个
32
位指令,即一个
MOV、MOVT
对。
您可利用它加载任何
32
位常数或访问整个地址空间。
如果用
MOV32
加载地址,则所生成的代码将与位置有关。
语法
MOV32{cond}
Rd,
expr
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
Rd
是要加载数据的寄存器。Rd
不可为
sp
或
pc。
expr
可以是下列项之一:
symbol
程序区域中的标签。
constant
任何
32
位常数。
symbol
+
constant
标签加上
32
位常数。
用法
MOV32
伪指令的主要功能有:
当单个指令中无法生成立即数时,生成文字常数。
将相对于程序的地址或外部地址载入寄存器中。
无论链接器将包含
MOV32
的
ELF
代码段置于何处,该地址始终有效。
Note
以这种方式加载的地址是在链接时确定的,因此代码不是位置无关的。
如果所引用的标签位于
Thumb
代码中,则
MOV32
将会设置该地址的
Thumb
位(位
0)。
体系结构
此伪指令在
ARMv6T2
和
ARMv7
中的
ARM
和
Thumb
状态下均有效。
LDR
伪指令
将以下项之一载入寄存器:
一个
32
位常数值
一个地址。
Note
本节仅介绍
LDR
伪
指令。
有关
LDR
指令
的详细信息,请参阅
内存访问指令。
有关使用
LDR
伪指令加载常数的信息,请参阅用
LDR
Rd,
=const
加载。
语法
LDR{cond}{w}
Rt,=[expr
|
label‑expr]
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
W
是可选的指令宽度说明符。
Rt
是要加载的寄存器。
那是不可能的,除非你加入了调试信息,也就是编译的时候加入了-g参数,然后用gdb调试就可以显示。最大程度上查看一个elf文件信息。
{
readelf -Wa aout | head
readelf -wi aout
readelf -p comment aout
objdump -s --section comment audioplayer
}
如下:
[root@localhost rootfs]# readelf -Wa bin/gzip
复制代码
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0xa080
Start of program headers: 52 (bytes into file)
Start of section headers: 1975444 (bytes into file)
Flags: 0x5000002, has entry point, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 25
Section header string table index: 24
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] noteABI-tag NOTE 000080f4 0000f4 000020 00 A 0 0 4
[ 2] init PROGBITS 00008114 000114 00000c 00 AX 0 0 4
[ 3] text PROGBITS 00008120 000120 17fcfc 00 AX 0 0 16
[ 4] __libc_freeres_fn PROGBITS 00187e1c 17fe1c 000f20 00 AX 0 0 4
[ 5] __libc_thread_fre PROGBITS 00188d3c 180d3c 0000e4 00 AX 0 0 4
[ 6] fini PROGBITS 00188e20 180e20 000008 00 AX 0 0 4
[ 7] rodata PROGBITS 00188e28 180e28 058147 00 A 0 0 8
[ 8] __libc_subfreeres PROGBITS 001e0f70 1d8f70 00005c 00 A 0 0 4
[ 9] __libc_atexit PROGBITS 001e0fcc 1d8fcc 000004 00 A 0 0 4
[10] __libc_thread_sub PROGBITS 001e0fd0 1d8fd0 000008 00 A 0 0 4
[11] ARMextab PROGBITS 001e0fd8 1d8fd8 001b04 00 A 0 0 4
[12] ARMexidx ARM_EXIDX 001e2adc 1daadc 006ea8 00 AL 3 0 4
[13] tdata PROGBITS 001f1984 1e1984 000018 00 WAT 0 0 4
[14] tbss NOBITS 001f199c 1e199c 000034 00 WAT 0 0 4
[15] init_array INIT_ARRAY 001f199c 1e199c 000004 00 WA 0 0 4
[16] fini_array FINI_ARRAY 001f19a0 1e19a0 000008 00 WA 0 0 4
[17] jcr PROGBITS 001f19a8 1e19a8 000004 00 WA 0 0 4
[18] datarelro PROGBITS 001f19ac 1e19ac 00002c 00 WA 0 0 4
[19] got PROGBITS 001f19d8 1e19d8 00007c 04 WA 0 0 4
[20] data PROGBITS 001f1a58 1e1a58 0008f7 00 WA 0 0 8
[21] bss NOBITS 001f2350 1e234f 004828 00 WA 0 0 8
[22] __libc_freeres_pt NOBITS 001f6b78 1e234f 00003c 00 WA 0 0 4
[23] ARMattributes ARM_ATTRIBUTES 00000000 1e234f 00002b 00 0 0 1
[24] shstrtab STRTAB 00000000 1e237a 000118 00 0 0 1
Section to Segment mapping:
Segment Sections
00 ARMexidx
01 noteABI-tag init text __libc_freeres_fn __libc_thread_freeres_fn fini rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres ARMextab ARMexidx
02 tdata init_array fini_array jcr datarelro got data bss __libc_freeres_ptrs
03 noteABI-tag
04 tdata tbss
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "5TE"
Tag_CPU_arch: v5TE
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_unknown_44: 1 (0x1)
复制代码
How to retrieve the GCC version used to compile a given ELF executable http://stackoverflowcom/questions/2387040/how-to-retrieve-the-gcc-version-used-to-compile-a-given-elf-executable
QUES: I'd like to retrieve the GCC version used to compile a given executable I tried readelf but didn't get the information Any thoughts
ANS: To complete what others have said: it's not stored in the object (or exe) file, unless you compile with debugging information! (option -g) If you compile with debug info, you can get it back with readelf:
复制代码
[root@localhost test]# gcc ac
[root@localhost test]# readelf -wi aout
[root@localhost test]# gcc ac -g
[root@localhost test]# readelf -wi aout
The section debug_info contains:
Compilation Unit @ offset 0x0:
Length: 135
Version: 2
Abbrev Offset: 0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
DW_AT_stmt_list : 0
DW_AT_high_pc : 0x400453
DW_AT_low_pc : 0x400448
DW_AT_producer : GNU C 412 20080704 (Red Hat 412-55)
DW_AT_language : 1 (ANSI C)
DW_AT_name : ac
DW_AT_comp_dir : /work/farsight/test
<1><61>: Abbrev Number: 2 (DW_TAG_subprogram)
DW_AT_external : 1
DW_AT_name : main
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_prototyped : 1
DW_AT_type : <83>
DW_AT_low_pc : 0x400448
DW_AT_high_pc : 0x400453
DW_AT_frame_base : 0 (location list)
<1><83>: Abbrev Number: 3 (DW_TAG_base_type)
DW_AT_name : int
DW_AT_byte_size : 4
DW_AT_encoding : 5 (signed)
复制代码
ANS2:
arm支持ddr,只不过内存形式因为节省空间,都是焊接上去的。就像笔记本内存和台式机内存虽然差不多,但是完全不兼容
现在最先进的arm内存是LP-DDR3 1066,Note3使用的。