所谓的代码段、数据段

所谓的代码段、数据段

一般面试C++,都会很无聊的问到虚拟函数的实现机制,接着就会问到vtable放在哪里 – 实现细节中的细节,我个人觉得这个除了卖弄没啥大意义,但面试嘛,一般就这吊样。

写个小程序

#include <iostream>

using namespace std;

// .data - read-write data
int rwdata = 100;

// .rodata - read-only data
const char* rodata = "hello, world";

// .bss - non-initialized data
int bssdata;

// .text 
void text_code()
{
        cout << "text_code" << endl;
}

class VTableTest
{
public:
        virtual void virtualfunc()
        {
                cout << "virtualfunc" << endl;
        }
};

int main()
{
        cout << ".data: " << &rwdata << endl;
        cout << ".rodata: " << reinterpret_cast<const void*>(rodata) << endl;
        cout << ".bss: " << &bssdata << endl;

        cout << ".text-normal-function: " << reinterpret_cast<void*>(text_code) << endl;

        VTableTest* pV = new VTableTest();
        long* pVlong = reinterpret_cast<long*>(pV);
        void* vptr = reinterpret_cast<void*>(*pVlong);
        cout << ".rodata-vtable: " << vptr << endl;
}

 

编译运行:

$ segment
.data: 0x804a030
.rodata: 0x80489d0
.bss: 0x804a114
.text-normal-function: 0x80486e4
.rodata-vtable: 0x8048a40

查询各个段的地址范围:

$ readelf -S segment
There are 29 section headers, starting at offset 0x115c:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4
  [ 3] .note.gnu.build-i NOTE            08048188 000188 000024 00   A  0   0  4
  [ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000034 04   A  5   0  4
  [ 5] .dynsym           DYNSYM          080481e0 0001e0 0000f0 10   A  6   1  4
  [ 6] .dynstr           STRTAB          080482d0 0002d0 00018e 00   A  0   0  1
  [ 7] .gnu.version      VERSYM          0804845e 00045e 00001e 02   A  5   0  2
  [ 8] .gnu.version_r    VERNEED         0804847c 00047c 000060 00   A  6   2  4
  [ 9] .rel.dyn          REL             080484dc 0004dc 000018 08   A  5   0  4
  [10] .rel.plt          REL             080484f4 0004f4 000050 08   A  5  12  4
  [11] .init             PROGBITS        08048544 000544 00002e 00  AX  0   0  4
  [12] .plt              PROGBITS        08048580 000580 0000b0 04  AX  0   0 16
  [13] .text             PROGBITS        08048630 000630 00037c 00  AX  0   0 16
  [14] .fini             PROGBITS        080489ac 0009ac 00001a 00  AX  0   0  4
  [15] .rodata           PROGBITS        080489c8 0009c8 000094 00   A  0   0  8
  [16] .eh_frame_hdr     PROGBITS        08048a5c 000a5c 00005c 00   A  0   0  4
  [17] .eh_frame         PROGBITS        08048ab8 000ab8 000168 00   A  0   0  4
  [18] .init_array       INIT_ARRAY      08049ef8 000ef8 000004 00  WA  0   0  4
  [19] .ctors            PROGBITS        08049efc 000efc 000008 00  WA  0   0  4
  [20] .dtors            PROGBITS        08049f04 000f04 000008 00  WA  0   0  4
  [21] .jcr              PROGBITS        08049f0c 000f0c 000004 00  WA  0   0  4
  [22] .dynamic          DYNAMIC         08049f10 000f10 0000e0 08  WA  6   0  4
  [23] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4
  [24] .got.plt          PROGBITS        08049ff4 000ff4 000034 04  WA  0   0  4
  [25] .data             PROGBITS        0804a028 001028 000010 00  WA  0   0  4
  [26] .bss              NOBITS          0804a040 001038 0000dc 00  WA  0   0 32
  [27] .comment          PROGBITS        00000000 001038 00002a 01  MS  0   0  1
  [28] .shstrtab         STRTAB          00000000 001062 0000f8 00      0   0  1

 

值得注意的是,vtable是作为readonly的data被放在.rodata段,而不是大家所认为的.text段(代码段)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110266.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JMM概述_jmi名词解释

    JMM概述_jmi名词解释简介什么是JMM内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(JavaMemoryModel,JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行

  • 职场上管理沟通工具的演化之路

    职场上管理沟通工具的演化之路

  • Android ListView下拉/上拉刷新:设计原理与实现「建议收藏」

    Android ListView下拉/上拉刷新:设计原理与实现「建议收藏」《AndroidListView下拉/上拉刷新:设计原理与实现》Android上ListView的第三方开源的下拉刷新框架很多,应用场景很多很普遍,几乎成为现在APP的通用设计典范,甚至谷歌官方都索性在AndroidSDK层面支持下拉刷新,我之前写了一篇文章《AndroidSwipeRefreshLayout:谷歌官方SDK包中的下拉刷新》专门介绍过(链接地址:http://bl

  • webstorm 2021 激活码【中文破解版】

    (webstorm 2021 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlb…

  • tomcat7配置教程_Tomcat热部署

    tomcat7配置教程_Tomcat热部署1.Tomcat依赖于JDK,需要提前安装好JDK,参考另外一篇文章:JAVA安装部署2.到官网下载Tomcat7,解压到相关路径即可。Tomcat官网3.从Tomcat7之后的版本都不需要配置环境变量,在bin目录下,查看starup.bat:意思是如果bin目录下面存在catalina.bat文件,就可以访问tomcat页面了,代表安装成功了。PS:如果没…

    2022年10月31日
  • pycharm配置python运行环境_C中调用Python

    pycharm配置python运行环境_C中调用Python目录前言一、系统路径说明二、环境配置1.在VS中选择ReleaseX642.菜单栏中选择:项目->属性3.生成dll答疑python程序目录下没有Numpy路径?具体代码参考博客前言本文主要讲解在Python程序中调用C(C++)程序的方法。主要思路是:在VS中配置好环境后,将C语言程序打包生成动态库文件.dll。将.dll改名成.pyd之后,装入相应路径,在pycharm中直接import即可环境:win10Pycharm(python3.6)(64位)VS2017(社区版)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号