debian wheezy 上的二进制文件不是 运行
binary not running on debian wheezy
我正在 debian wheezy 上编译以下汇编程序,但它不会 运行 给我错误:
-bash: ./power: 无法执行二进制文件
代码
.section data
.section text
.global _start
_start:
# do first calc and save the answer
pushl
pushl
call power
addl , %esp
pushl %eax
# do second calc
pushl
pushl
call power
addl , %esp
# add both together
popl %ebx
addl %eax, %ebx
# exit with answer as return status
movl , %eax
int [=11=]x80
.type power, @function
power:
# ?
pushl %ebp
movl %esp, %ebp
subl , %esp
# load params
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
movl %ebx, -4(%ebp)
power_loop_start:
# have we looped down to 1?
cmpl , %ecx
je end_power
# multiply prev result by base and store
movl -4(%ebp), %eax
imull %ebx, %eax
movl %eax, -4(%ebp)
# go again
decl %ecx
jmp power_loop_start
end_power:
movl -4(%ebp), %eax
movl %ebp, %esp
popl %ebp
ret
我运行与:
as power.s -o power.o
ld power.o -o power
./power
uname -m
和 arch
都给我 i686,二进制输出 objdump -x
:
$ objdump -x power
power: file format elf32-i386
power
architecture: i386, flags 0x00000012:
EXEC_P, HAS_SYMS
start address 0x00000000
Sections:
Idx Name Size VMA LMA File off Algn
0 text 0000004a 00000000 00000000 00000034 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l d text 00000000 text
00000023 l F text 00000000 power
00000032 l text 00000000 power_loop_start
00000043 l text 00000000 end_power
00000000 g text 00000000 _start
08049034 g *ABS* 00000000 __bss_start
08049034 g *ABS* 00000000 _edata
08049034 g *ABS* 00000000 _end
不确定我做错了什么。
进一步说明:
这个例子来自《从头开始编程》一书。我在 Red Hat x86_64 机器上试过,带有 as
标志 --32
和 ld
标志 -m elf_i386
,它所有编译都很好,就像在 x86 机器上一样,但是执行时会出现相同的错误。
您有一个错字:.section text
应该是 .section .text
(注意圆点)或者只是 .text
虽然这个问题是由打字错误引起的,但我觉得它值得一些解释,尤其是因为你很好地提供了所有细节:)
虽然您可以随心所欲地命名您的部分(这就是工具没有抱怨的原因),但每个部分都有一些标志。在这种情况下,您会在 objdump 输出中看到:CONTENTS, READONLY
。这意味着该部分不可执行,实际上它甚至没有加载。 (可以说错误信息可以更精确一些。)
好的,为什么它不可执行?汇编器识别一些常见的段名称并正确设置标志。对于自定义名称,您必须手动执行此操作,例如通过执行 .section text, "ax"
设置 ALLOC
和 CODE
。另见 .section
directive in the manual and this answer about the various flags.
我正在 debian wheezy 上编译以下汇编程序,但它不会 运行 给我错误:
-bash: ./power: 无法执行二进制文件
代码
.section data
.section text
.global _start
_start:
# do first calc and save the answer
pushl
pushl
call power
addl , %esp
pushl %eax
# do second calc
pushl
pushl
call power
addl , %esp
# add both together
popl %ebx
addl %eax, %ebx
# exit with answer as return status
movl , %eax
int [=11=]x80
.type power, @function
power:
# ?
pushl %ebp
movl %esp, %ebp
subl , %esp
# load params
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
movl %ebx, -4(%ebp)
power_loop_start:
# have we looped down to 1?
cmpl , %ecx
je end_power
# multiply prev result by base and store
movl -4(%ebp), %eax
imull %ebx, %eax
movl %eax, -4(%ebp)
# go again
decl %ecx
jmp power_loop_start
end_power:
movl -4(%ebp), %eax
movl %ebp, %esp
popl %ebp
ret
我运行与:
as power.s -o power.o
ld power.o -o power
./power
uname -m
和 arch
都给我 i686,二进制输出 objdump -x
:
$ objdump -x power
power: file format elf32-i386
power
architecture: i386, flags 0x00000012:
EXEC_P, HAS_SYMS
start address 0x00000000
Sections:
Idx Name Size VMA LMA File off Algn
0 text 0000004a 00000000 00000000 00000034 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l d text 00000000 text
00000023 l F text 00000000 power
00000032 l text 00000000 power_loop_start
00000043 l text 00000000 end_power
00000000 g text 00000000 _start
08049034 g *ABS* 00000000 __bss_start
08049034 g *ABS* 00000000 _edata
08049034 g *ABS* 00000000 _end
不确定我做错了什么。
进一步说明:
这个例子来自《从头开始编程》一书。我在 Red Hat x86_64 机器上试过,带有 as
标志 --32
和 ld
标志 -m elf_i386
,它所有编译都很好,就像在 x86 机器上一样,但是执行时会出现相同的错误。
您有一个错字:.section text
应该是 .section .text
(注意圆点)或者只是 .text
虽然这个问题是由打字错误引起的,但我觉得它值得一些解释,尤其是因为你很好地提供了所有细节:)
虽然您可以随心所欲地命名您的部分(这就是工具没有抱怨的原因),但每个部分都有一些标志。在这种情况下,您会在 objdump 输出中看到:CONTENTS, READONLY
。这意味着该部分不可执行,实际上它甚至没有加载。 (可以说错误信息可以更精确一些。)
好的,为什么它不可执行?汇编器识别一些常见的段名称并正确设置标志。对于自定义名称,您必须手动执行此操作,例如通过执行 .section text, "ax"
设置 ALLOC
和 CODE
。另见 .section
directive in the manual and this answer about the various flags.