不能 link c++ 在汇编中运行
Can't link c++ function in assembly
抱歉,如果还有其他类似的问题,但我几乎尝试了所有方法都没有结果。
我有一个汇编文件调用了一个cpp文件的main函数(我正在做一个内核入口)
kerne.asm
[bits 32]
[extern _main]
jmp _main
cli
hlt
main.cpp
void a()
{
//a
}
void bc()
{
//bc
}
extern "C" int main()
{
return 0;
}
生成文件
all: kes.o ke.o ke1.tmp otp.txt
kes.o : kerne.asm
nasm -f win32 -o H:\x86f\lkt\kes.o H:\x86f\lkt\kerne.asm
ke.o : main.cpp
g++ -Wall -m32 -g -std=c++14 -std=c++1y -ffreestanding -nostartfiles -c main.cpp -o ke.o
ke1.tmp : kes.o ke.o
ld -m i386pe -r -o ke1.tmp -Ttext 0x1000 kes.o ke.o
otp.txt : ke1.tmp
objdump -d ke1.tmp > otp.txt
otp.txt输出
ke1.tmp: file format pe-i386
Disassembly of section .text:
00001000 <.text>:
1000: e9 00 00 00 00 jmp 1005 <.text+0x5>
1005: ee out %al,(%dx)
1006: 77 90 ja f98 <@feat.00+0xf97>
00001008 <__Z1av>:
1008: 55 push %ebp
1009: 89 e5 mov %esp,%ebp
100b: 90 nop
100c: 5d pop %ebp
100d: c3 ret
0000100e <__Z2bcv>:
100e: 55 push %ebp
100f: 89 e5 mov %esp,%ebp
1011: 90 nop
1012: 5d pop %ebp
1013: c3 ret
00001014 <_main>:
1014: 55 push %ebp
1015: 89 e5 mov %esp,%ebp
1017: 83 e4 f0 and [=14=]xfffffff0,%esp
101a: e8 00 00 00 00 call 101f <_main+0xb>
101f: b8 00 00 00 00 mov [=14=]x0,%eax
1024: c9 leave
1025: c3 ret
1026: 90 nop
1027: 90 nop
...
在 otp 输出中,1000 处的指令是 jmp _main istrunction。您如何看到地址未正确解析,使其指向下一条指令 (1005)。我哪里做错了?
编辑:
海里kes.o
00000000 a .absolut
00000000 t .text
00000001 a @feat.00
U _main
海里ke.o
00000000 b .bss
00000000 d .data
00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_frame
00000000 N .debug_info
00000000 N .debug_line
00000000 r .rdata$zzz
00000000 t .text
U ___main
00000000 T __Z1av
00000006 T __Z2bcv
0000000c T _main
objdump -r ke1.tmp
ke1.tmp: file format pe-i386
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000001 DISP32 _main-0x00000014
0000001b DISP32 ___main+0x00001000
RELOCATION RECORDS FOR [.debug_aranges]:
OFFSET TYPE VALUE
00000006 secrel32 .debug_info
00000010 dir32 .text-0x00001008
RELOCATION RECORDS FOR [.debug_info]:
OFFSET TYPE VALUE
00000006 secrel32 .debug_abbrev
00000088 dir32 .text-0x00001008
00000090 secrel32 .debug_line
000000a1 dir32 .text-0x00001008
000000c0 dir32 .text-0x00001008
000000d6 dir32 .text-0x00001008
RELOCATION RECORDS FOR [.debug_line]:
OFFSET TYPE VALUE
0000003a dir32 .text-0x00001008
RELOCATION RECORDS FOR [.debug_frame]:
OFFSET TYPE VALUE
00000018 secrel32 .debug_frame
0000001c dir32 .text-0x00001008
00000038 secrel32 .debug_frame
0000003c dir32 .text-0x00001008
00000058 secrel32 .debug_frame
0000005c dir32 .text-0x00001008
原因是使用 -r
选项,ld
生成目标文件,而不是 executable。在目标文件中,许多地址未设置,因为稍后将使用来自重定位 table.
的数据通过最终链接(没有 -r
)设置它们
@DavidWohlferd @fuz @numzero 是的,问题是 ld 中的 -r 标志。现在所有地址都已正确解析。感谢大家的帮助!
抱歉,如果还有其他类似的问题,但我几乎尝试了所有方法都没有结果。
我有一个汇编文件调用了一个cpp文件的main函数(我正在做一个内核入口)
kerne.asm
[bits 32]
[extern _main]
jmp _main
cli
hlt
main.cpp
void a()
{
//a
}
void bc()
{
//bc
}
extern "C" int main()
{
return 0;
}
生成文件
all: kes.o ke.o ke1.tmp otp.txt
kes.o : kerne.asm
nasm -f win32 -o H:\x86f\lkt\kes.o H:\x86f\lkt\kerne.asm
ke.o : main.cpp
g++ -Wall -m32 -g -std=c++14 -std=c++1y -ffreestanding -nostartfiles -c main.cpp -o ke.o
ke1.tmp : kes.o ke.o
ld -m i386pe -r -o ke1.tmp -Ttext 0x1000 kes.o ke.o
otp.txt : ke1.tmp
objdump -d ke1.tmp > otp.txt
otp.txt输出
ke1.tmp: file format pe-i386
Disassembly of section .text:
00001000 <.text>:
1000: e9 00 00 00 00 jmp 1005 <.text+0x5>
1005: ee out %al,(%dx)
1006: 77 90 ja f98 <@feat.00+0xf97>
00001008 <__Z1av>:
1008: 55 push %ebp
1009: 89 e5 mov %esp,%ebp
100b: 90 nop
100c: 5d pop %ebp
100d: c3 ret
0000100e <__Z2bcv>:
100e: 55 push %ebp
100f: 89 e5 mov %esp,%ebp
1011: 90 nop
1012: 5d pop %ebp
1013: c3 ret
00001014 <_main>:
1014: 55 push %ebp
1015: 89 e5 mov %esp,%ebp
1017: 83 e4 f0 and [=14=]xfffffff0,%esp
101a: e8 00 00 00 00 call 101f <_main+0xb>
101f: b8 00 00 00 00 mov [=14=]x0,%eax
1024: c9 leave
1025: c3 ret
1026: 90 nop
1027: 90 nop
...
在 otp 输出中,1000 处的指令是 jmp _main istrunction。您如何看到地址未正确解析,使其指向下一条指令 (1005)。我哪里做错了?
编辑:
海里kes.o
00000000 a .absolut
00000000 t .text
00000001 a @feat.00
U _main
海里ke.o
00000000 b .bss
00000000 d .data
00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_frame
00000000 N .debug_info
00000000 N .debug_line
00000000 r .rdata$zzz
00000000 t .text
U ___main
00000000 T __Z1av
00000006 T __Z2bcv
0000000c T _main
objdump -r ke1.tmp
ke1.tmp: file format pe-i386
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000001 DISP32 _main-0x00000014
0000001b DISP32 ___main+0x00001000
RELOCATION RECORDS FOR [.debug_aranges]:
OFFSET TYPE VALUE
00000006 secrel32 .debug_info
00000010 dir32 .text-0x00001008
RELOCATION RECORDS FOR [.debug_info]:
OFFSET TYPE VALUE
00000006 secrel32 .debug_abbrev
00000088 dir32 .text-0x00001008
00000090 secrel32 .debug_line
000000a1 dir32 .text-0x00001008
000000c0 dir32 .text-0x00001008
000000d6 dir32 .text-0x00001008
RELOCATION RECORDS FOR [.debug_line]:
OFFSET TYPE VALUE
0000003a dir32 .text-0x00001008
RELOCATION RECORDS FOR [.debug_frame]:
OFFSET TYPE VALUE
00000018 secrel32 .debug_frame
0000001c dir32 .text-0x00001008
00000038 secrel32 .debug_frame
0000003c dir32 .text-0x00001008
00000058 secrel32 .debug_frame
0000005c dir32 .text-0x00001008
原因是使用 -r
选项,ld
生成目标文件,而不是 executable。在目标文件中,许多地址未设置,因为稍后将使用来自重定位 table.
-r
)设置它们
@DavidWohlferd @fuz @numzero 是的,问题是 ld 中的 -r 标志。现在所有地址都已正确解析。感谢大家的帮助!