关于 ld 命令中 -Ttext 参数 的测试
2012-04-12 20:25
232 查看
文件sramboot.S
#include"regdef.h"
.text
.globl main
main:
.set noreorder
.set noat
la at, value
lw a0, 0(at)
lw a1, 4(at)
jal my_add
add a2, a0, a1
sw a2, 8(at)
文件#include"regdef.h"
.text
.globl my_add,value
my_add:
.set noreorder
add a0,a0,3
j ra
add a1,a1,4
.data
value: .word 10, 20, 0
Makefile文件
CC = mipsel-linux-gcc
AS = mipsel-linux-as
LD = mipsel-linux-ld
OBJDUMP = mipsel-linux-objdump
OBJCOPY = mipsel-linux-objcopy
TEXTBASE =
LDFLAGS = $(TEXTBASE) -T my.ld
test.bin:test.exe
$(OBJCOPY) -O binary test.exe test.bin
test.exe: call.o sramboot.o
$(LD) call.o sramboot.o $(LDFLAGS) -o test.exe
$(OBJDUMP) -D test.exe > test.dump
rm *.s
sramboot.o:sramboot.S
$(CC) -E sramboot.S -o sramboot.s
$(AS) sramboot.s -o sramboot.o
call.o:call.S
$(CC) -E call.S -o call.s
$(AS) call.s -o call.o
clean:
rm *.o *.exe *.bin *.dump
my.ld文件
OUTPUT_FORMAT("elf32-tradlittlemips","elf32-tradbigmips","elf32-tradlittlemips")
OUTPUT_ARCH(mips)
SECTIONS
{
.init :
{
sramboot.o
}
.text :
{
*(.text)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
test.sh文件
#! /bin/sh
mipsel-linux-objdump -D -m mips -b binary -EL -M no-aliases -z test.bin >my.dump
产看原生机器码,可以运行test.sh
下只列出test.dump
测试1:
没有指定Ttext .=0
test.exe: file format elf32-tradlittlemips
Disassembly of section .init:
00000000 <main>:
0: 3c010000 lui at,0x0
4: 24210050 addiu at,at,80
8: 8c240000 lw a0,0(at)
c: 8c250004 lw a1,4(at)
10: 0c000008 jal 20 <my_add>
14: 00000000 nop
18: 00853020 add a2,a0,a1
1c: ac260008 sw a2,8(at)
Disassembly of section .text:
00000020 <my_add>:
20: 20840003 addi a0,a0,3
24: 03e00008 jr ra
28: 20a50004 addi a1,a1,4
2c: 00000000 nop
Disassembly of section .reginfo:
00000030 <.reginfo>:
30: 80000030 lb zero,48(zero)
...
Disassembly of section .data:
00000050 <value>:
50: 0000000a 0xa
54: 00000014 0x14
测试2:
指定 –Ttext = 0x50 .=0
test.exe: file format elf32-tradlittlemips
Disassembly of section .text:
00000050 <my_add>:
50: 20840003 addi a0,a0,3
54: 03e00008 jr ra
58: 20a50004 addi a1,a1,4
5c: 00000000 nop
Disassembly of section .reginfo:
00000060 <.reginfo>:
60: 80000030 lb zero,48(zero)
...
Disassembly of section .init:
00000000 <main>:
0: 3c010000 lui at,0x0
4: 24210080 addiu at,at,128
8: 8c240000 lw a0,0(at)
c: 8c250004 lw a1,4(at)
10: 0c000014 jal 50 <my_add>
14: 00000000 nop
18: 00853020 add a2,a0,a1
1c: ac260008 sw a2,8(at)
Disassembly of section .data:
00000080 <value>:
80: 0000000a 0xa
84: 00000014 0x14
测试3:
指定 –Ttext = 0x50 .=0x80000000 (在.text输出section前加)
结果说明 –Ttext的优先级高,且影响后面的.data输出 section的虚拟地址
test.exe: file format elf32-tradlittlemips
Disassembly of section .text:
00000050 <my_add>:
50: 20840003 addi a0,a0,3
54: 03e00008 jr ra
58: 20a50004 addi a1,a1,4
5c: 00000000 nop
Disassembly of section .reginfo:
00000060 <.reginfo>:
60: 80000030 lb zero,48(zero)
...
Disassembly of section .init:
00000000 <main>:
0: 3c010000 lui at,0x0
4: 24210080 addiu at,at,128
8: 8c240000 lw a0,0(at)
c: 8c250004 lw a1,4(at)
10: 0c000014 jal 50 <my_add>
14: 00000000 nop
18: 00853020 add a2,a0,a1
1c: ac260008 sw a2,8(at)
Disassembly of section .data:
00000080 <value>:
80: 0000000a 0xa
84: 00000014 0x14
...、
通过以上测试可以看出,-Ttext ( -Tdata -Tbss)优先级高于.计数器,
由于我们并未指定LMA,所以LMA=VMA,造成当我们指定-Ttext时,原生机器码内充斥着大量的无效数据,占用存储空间,
通过指定LMA,我们可以有效的减少被占用的存储空间。
#include"regdef.h"
.text
.globl main
main:
.set noreorder
.set noat
la at, value
lw a0, 0(at)
lw a1, 4(at)
jal my_add
add a2, a0, a1
sw a2, 8(at)
文件#include"regdef.h"
.text
.globl my_add,value
my_add:
.set noreorder
add a0,a0,3
j ra
add a1,a1,4
.data
value: .word 10, 20, 0
Makefile文件
CC = mipsel-linux-gcc
AS = mipsel-linux-as
LD = mipsel-linux-ld
OBJDUMP = mipsel-linux-objdump
OBJCOPY = mipsel-linux-objcopy
TEXTBASE =
LDFLAGS = $(TEXTBASE) -T my.ld
test.bin:test.exe
$(OBJCOPY) -O binary test.exe test.bin
test.exe: call.o sramboot.o
$(LD) call.o sramboot.o $(LDFLAGS) -o test.exe
$(OBJDUMP) -D test.exe > test.dump
rm *.s
sramboot.o:sramboot.S
$(CC) -E sramboot.S -o sramboot.s
$(AS) sramboot.s -o sramboot.o
call.o:call.S
$(CC) -E call.S -o call.s
$(AS) call.s -o call.o
clean:
rm *.o *.exe *.bin *.dump
my.ld文件
OUTPUT_FORMAT("elf32-tradlittlemips","elf32-tradbigmips","elf32-tradlittlemips")
OUTPUT_ARCH(mips)
SECTIONS
{
.init :
{
sramboot.o
}
.text :
{
*(.text)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
test.sh文件
#! /bin/sh
mipsel-linux-objdump -D -m mips -b binary -EL -M no-aliases -z test.bin >my.dump
产看原生机器码,可以运行test.sh
下只列出test.dump
测试1:
没有指定Ttext .=0
test.exe: file format elf32-tradlittlemips
Disassembly of section .init:
00000000 <main>:
0: 3c010000 lui at,0x0
4: 24210050 addiu at,at,80
8: 8c240000 lw a0,0(at)
c: 8c250004 lw a1,4(at)
10: 0c000008 jal 20 <my_add>
14: 00000000 nop
18: 00853020 add a2,a0,a1
1c: ac260008 sw a2,8(at)
Disassembly of section .text:
00000020 <my_add>:
20: 20840003 addi a0,a0,3
24: 03e00008 jr ra
28: 20a50004 addi a1,a1,4
2c: 00000000 nop
Disassembly of section .reginfo:
00000030 <.reginfo>:
30: 80000030 lb zero,48(zero)
...
Disassembly of section .data:
00000050 <value>:
50: 0000000a 0xa
54: 00000014 0x14
测试2:
指定 –Ttext = 0x50 .=0
test.exe: file format elf32-tradlittlemips
Disassembly of section .text:
00000050 <my_add>:
50: 20840003 addi a0,a0,3
54: 03e00008 jr ra
58: 20a50004 addi a1,a1,4
5c: 00000000 nop
Disassembly of section .reginfo:
00000060 <.reginfo>:
60: 80000030 lb zero,48(zero)
...
Disassembly of section .init:
00000000 <main>:
0: 3c010000 lui at,0x0
4: 24210080 addiu at,at,128
8: 8c240000 lw a0,0(at)
c: 8c250004 lw a1,4(at)
10: 0c000014 jal 50 <my_add>
14: 00000000 nop
18: 00853020 add a2,a0,a1
1c: ac260008 sw a2,8(at)
Disassembly of section .data:
00000080 <value>:
80: 0000000a 0xa
84: 00000014 0x14
测试3:
指定 –Ttext = 0x50 .=0x80000000 (在.text输出section前加)
结果说明 –Ttext的优先级高,且影响后面的.data输出 section的虚拟地址
test.exe: file format elf32-tradlittlemips
Disassembly of section .text:
00000050 <my_add>:
50: 20840003 addi a0,a0,3
54: 03e00008 jr ra
58: 20a50004 addi a1,a1,4
5c: 00000000 nop
Disassembly of section .reginfo:
00000060 <.reginfo>:
60: 80000030 lb zero,48(zero)
...
Disassembly of section .init:
00000000 <main>:
0: 3c010000 lui at,0x0
4: 24210080 addiu at,at,128
8: 8c240000 lw a0,0(at)
c: 8c250004 lw a1,4(at)
10: 0c000014 jal 50 <my_add>
14: 00000000 nop
18: 00853020 add a2,a0,a1
1c: ac260008 sw a2,8(at)
Disassembly of section .data:
00000080 <value>:
80: 0000000a 0xa
84: 00000014 0x14
...、
通过以上测试可以看出,-Ttext ( -Tdata -Tbss)优先级高于.计数器,
由于我们并未指定LMA,所以LMA=VMA,造成当我们指定-Ttext时,原生机器码内充斥着大量的无效数据,占用存储空间,
通过指定LMA,我们可以有效的减少被占用的存储空间。
相关文章推荐
- 关于远程执行命令的psexec工具---参数过长,导致psexec崩溃的解决方法
- 关于对SSH隧道SSH Tunnel命令参数的理解
- FIS--关于下载php后的配置(启动fis的调试服务器(注意添加 --no-rewrite 参数),如果报错 没有php-cgi环境,请 安装 它,并把php-cgi命令加到系统的环境变量)
- 关于apt-get命令介绍及其参数使用
- EIGRP分解试验部分-LAB8:STUB命令参数测试
- 关于命令tail的参数-F的使用
- 关于SQL 参数的一次测试(重新又测了一次)
- PHP关于传众多参数还是传上下文对象的性能测试
- 关于测试工程师 linux的常用命令
- 关于find命令下mtime参数使用~
- ab压力测试命令及参数详解
- 关于rpm 命令的--changelog参数
- 关于Maven常用命令及编译时候忽略单元格测试的方法
- linux ping命令参数及用法详解--linux测试网络连通性命令
- Apache Struts2 多个前缀参数远程命令执行漏洞及测试方法
- monkey实战--测试步骤、常用参数、常规monkey命令
- 关于Ajax的cache参数的测试
- 关于arm-linux-ld命令集
- 关于测试Windows电脑端口的命令 —— telnet用法