当前位置: 技术问答>linux和unix
关于使用 g++/ld 编译连接多个 c++ 文件的问题!
来源: 互联网 发布时间:2015-10-09
本文导语: 我遇到了一点麻烦~希望大家帮助~我有2个C++文件~分别叫 A.cpp、B.cpp,一个头文件 B.h、他们的内容如下: //---------A.cpp-------------------- #include "B.H" extern "C" void A_Fun(); extern "C" void A_Main() { B_Fun(); A_...
我遇到了一点麻烦~希望大家帮助~我有2个C++文件~分别叫 A.cpp、B.cpp,一个头文件 B.h、他们的内容如下:
//---------A.cpp--------------------
#include "B.H"
extern "C" void A_Fun();
extern "C" void A_Main()
{
B_Fun();
A_Fun();
}
extern "C" void A_Fun()
{
return;
}
//---------B.H--------------------
extern "C" void B_Fun();
//---------B.cpp-------------------
#include "B.H"
extern "C" void B_Fun()
{
return;
}
我使用如下脚本编译(Windows环境)
# 编译A.cpp
g++ -ffreestanding -nostdinc++ -nostdinc -nostdlib -o A.o -c A.Cpp
# 编译B.cpp
g++ -ffreestanding -nostdinc++ -nostdinc -nostdlib -o B.o -c B.Cpp
# 连接
ld -o AB.ld -O -i -Ttext 0x100000 -e _A_Main A.o B.o
# 反汇编
objdump -D AB.ld > AB.txt
问题就出在反汇编后的AB.txt文件中对 B_Fun() 的调用代码上:" call 10002b "
多出个偏移量 0xb ?? ?为什么??啊??
AB.ld: file format coff-go32-exe
Disassembly of section .text:
00100000 :
100000: 55 push %ebp
100001: 89 e5 mov %esp,%ebp
100003: 83 ec 08 sub $0x8,%esp
100006: e8 20 00 00 00 call 10002b
10000b: e8 02 00 00 00 call 100012
100010: c9 leave
100011: c3 ret
00100012 :
100012: 55 push %ebp
100013: 89 e5 mov %esp,%ebp
100015: 5d pop %ebp
100016: c3 ret
100017: 90 nop
100018: 90 nop
100019: 90 nop
10001a: 90 nop
10001b: 90 nop
10001c: 90 nop
10001d: 90 nop
10001e: 90 nop
10001f: 90 nop
00100020 :
100020: 55 push %ebp
100021: 89 e5 mov %esp,%ebp
100023: 5d pop %ebp
100024: c3 ret
100025: 90 nop
100026: 90 nop
100027: 90 nop
100028: 90 nop
100029: 90 nop
10002a: 90 nop
10002b: 90 nop
10002c: 90 nop
10002d: 90 nop
10002e: 90 nop
10002f: 90 nop
00100030 :
...
Disassembly of section .data:
00100200 :
100200: 00 00 add %al,(%eax)
...
00100204 :
...
//---------A.cpp--------------------
#include "B.H"
extern "C" void A_Fun();
extern "C" void A_Main()
{
B_Fun();
A_Fun();
}
extern "C" void A_Fun()
{
return;
}
//---------B.H--------------------
extern "C" void B_Fun();
//---------B.cpp-------------------
#include "B.H"
extern "C" void B_Fun()
{
return;
}
我使用如下脚本编译(Windows环境)
# 编译A.cpp
g++ -ffreestanding -nostdinc++ -nostdinc -nostdlib -o A.o -c A.Cpp
# 编译B.cpp
g++ -ffreestanding -nostdinc++ -nostdinc -nostdlib -o B.o -c B.Cpp
# 连接
ld -o AB.ld -O -i -Ttext 0x100000 -e _A_Main A.o B.o
# 反汇编
objdump -D AB.ld > AB.txt
问题就出在反汇编后的AB.txt文件中对 B_Fun() 的调用代码上:" call 10002b "
多出个偏移量 0xb ?? ?为什么??啊??
AB.ld: file format coff-go32-exe
Disassembly of section .text:
00100000 :
100000: 55 push %ebp
100001: 89 e5 mov %esp,%ebp
100003: 83 ec 08 sub $0x8,%esp
100006: e8 20 00 00 00 call 10002b
10000b: e8 02 00 00 00 call 100012
100010: c9 leave
100011: c3 ret
00100012 :
100012: 55 push %ebp
100013: 89 e5 mov %esp,%ebp
100015: 5d pop %ebp
100016: c3 ret
100017: 90 nop
100018: 90 nop
100019: 90 nop
10001a: 90 nop
10001b: 90 nop
10001c: 90 nop
10001d: 90 nop
10001e: 90 nop
10001f: 90 nop
00100020 :
100020: 55 push %ebp
100021: 89 e5 mov %esp,%ebp
100023: 5d pop %ebp
100024: c3 ret
100025: 90 nop
100026: 90 nop
100027: 90 nop
100028: 90 nop
100029: 90 nop
10002a: 90 nop
10002b: 90 nop
10002c: 90 nop
10002d: 90 nop
10002e: 90 nop
10002f: 90 nop
00100030 :
...
Disassembly of section .data:
00100200 :
100200: 00 00 add %al,(%eax)
...
00100204 :
...
|
可能是freestanding选项的影响吧
看看coff文件的格式
看看coff文件的格式
|
反编译,汇编生输了。