当前位置:  技术问答>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 :
...

|
可能是freestanding选项的影响吧

看看coff文件的格式

|
反编译,汇编生输了。

    
 
 

您可能感兴趣的文章:

  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 为什么使用了-l但 仍然不能使用C++类库
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • linux下的C++编译器怎样使用?
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 各位在Unix下开发,使用哪种c++编译器?
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 在Linux下怎么使用C++啊?gcc是C吧?
  • c++类库Boost::bimap(双向映射)介绍及使用实例
  • 请问linux下可以使用c++么?
  • TinyXML(c++下操作xml的库)介绍,下载地址及使用代码举例
  • redhat linux平台下文件正在使用判别C++?
  • 在Python中使用SWIG调用C和C++程序
  • 如何编译一个使用了QT或KDE类的C++程序
  • c++ stl multimap基本操作使用技巧详细介绍
  • Linux下使用C++互斥访问文件+消息队列
  • 请问怎么样使用 Linux下的C++集成开发环境。
  • 使用c++编写gtk程序
  • putty下如何使用gcc编译c或c++程序的资料
  • 大家在UNIX下写程序使用C++么?
  • 是不是只有C++才可以使用STL?
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()
  • ubuntu 10.10出现极其诡异的情况,使用gcc编译没任何反应,可以继续输入,但是不提示任何错误;使用make编译效果一样;
  • PROC开发时 //注释编译不通过 如何设置使用cpp编译。
  • 谁知道如何在i386平台使用交叉编译工具为mips平台编译libtiff啊?
  • LINUX下使用Eclipse,如何使用交叉编译器?
  • 如何使用arm-uclibc-gcc将.c文件编译生成.a,将.c文件编译生成.cgi?
  • 关于大于2G内存的使用.....按32位编译的进程怎么使用大于2G的内存?
  • 使用gcc编译器进行代码编译出来的程序是否遵循gpl协议
  • 在Linux下使用GCC如何编译生成Windows下使用的DLL?
  • 在redhat9.0下,怎样使用自带的gcc编译器的? 是在终端使用吗? 有这方面的资料么?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问如何在一个文件系统修改源码管理并使用多个卷(存储设备)
  • 怎么使用grep查找满足多个关键字任意一个的行
  • 一个虚拟主机使用多个域名的配置方法(apache)该怎么写?
  • jquery代码-如何使用多个属性来进行过滤
  • 多个用户同时使用bean,bean中的变量和方法会不会冲突?
  • 为什么使用了-l但 仍然不能使用C++类库 iis7站长之家
  • 请问如何在linux下一个工程里面使用多个cpp文件
  • ftp账号与多个使用者的疑惑
  • 在shell脚本中如何使用FTP一次删除远端的多个文件?
  • php使用array_rand()函数从数组中随机选择一个或多个元素
  • Linux下面如何使用make命令编译多个.c文件
  • apache中使用mod_gnutls模块实现多个SSL站点配置(多个HTTPS协议的虚拟主机)
  • linux下一次使用多个静态库的makefile编写?
  • 调用同一个函数建立的多个线程,如何使用函数的数据?
  • 不使用semget等信号量相关的函数如何实现多个进程对同一个文件的访问
  • 多个文件使用同一个函数时的重复定义错误
  • 求教:在一台机器上多个进程之间使用udp通信是否可靠,谢谢
  • 在linux7.3下多个线程使用 pthread_cond_t 的一个小问题。
  • 如何实现只有指定的计算机可以登录系统?(系统为JSP+EJB,使用者跨多个网段)
  • php使用多个进程同时控制文件读写示例
  • Python不使用print而直接输出二进制字符串
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • Office 2010 Module模式下使用VBA Addressof
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • c/c++预处理命令预#,##使用介绍
  • c#中SAPI使用总结——SpVoice的使用方法
  • 在div中使用css让文字底部对齐的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3