zoukankan      html  css  js  c++  java
  • strtab symtab shstrtab

    关于.strtab,.symtab,.shstrtab
    .strtab是字符串表(STRING TABLE)
    .shstrtab是段表字符串表(Section Header String Table),针对段表
    .symtab是符号表,一般是变量、函数

    shstrtab及symtab经常引用strtab中的字符串。


    ld链接脚本中将会定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并应用,我们称之为特殊符号。
    查看ld的默认链接脚本:
    ld -verbose
    对于这些特殊符号,我们不必定义它,只需声明引用即可使用。链接器会在将程序最终链接成可执行文件的时候将其解析成正确的值,只有
    在使用ld链接生成最终可执行文件的时候这些符号才会存在。

    下列地址都是程序被装载时的虚拟地址:
    __executable_start,该符号为程序的起始地址,注意,不是入口地址,是程序最开始的地址。
    __etext或_etext或etext,该符号为代码段结束地址,即代码段最末尾的地址。
    _edata或edata,该符号为数据段结束地址,即数据段最末尾的地址。
    _end或end,该符号为程序结束地址。

          1 #include <stdio.h>                                                                                         
          2
          3 extern char __executable_start [];
          4 extern char etext[], _etext[], __etext[];
          5 extern char edata[], _edata[];
          6 extern char end[], _end[];
          7
          8 int main(void)
          9 {
         10     printf("Executable Start %p\n", __executable_start);
         11     printf("Text End %p %p %p\n", etext, _etext, __etext);
         12     printf("Data End %p %p\n", edata, _edata);
         13     printf("Executable End %p %p\n", end, _end);
         14     return 0;
         15 }

    输出结果:

    Executable Start 0x400000
    Text End 0x400656 0x400656 0x400656
    Data End 0x601020 0x601020
    Executable End 0x601030 0x601030

          1 #include <stdio.h>                                                                                         
          2
          3 extern char __executable_start;
          4 extern char etext[], _etext[], __etext[];
          5 extern char edata[], _edata[];
          6 extern char end[], _end[];
          7
          8 int main(void)
          9 {
         10     printf("Executable Start %x\n", __executable_start);
         11     printf("Executable Start %p\n", &__executable_start);
         12     printf("Text End %p %p %p\n", etext, _etext, __etext);
         13     printf("Data End %p %p\n", edata, _edata);
         14     printf("Executable End %p %p\n", end, _end);
         15     return 0;
         16 }

    输出结果:

    Executable Start 7f
    Executable Start 0x400000
    Text End 0x400676 0x400676 0x400676
    Data End 0x601020 0x601020
    Executable End 0x601030 0x601030

  • 相关阅读:
    gin使用validator库参数校验若干实用技巧
    在gin框架中使用JWT
    使用zap接收gin框架默认的日志并配置日志归档
    gin框架路由拆分与注册
    Gin框架介绍及使用
    GO学习-(39) 优雅地关机或重启
    GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
    WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
    [ 夜间模式 ] NightVersion
    HDU1518 Square(DFS)
  • 原文地址:https://www.cnblogs.com/openix/p/2834498.html
Copyright © 2011-2022 走看看