未解决符号表,导出符号表和地址重定向表

让我们总结一下:编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表。 
    未解决符号表提供了所有在该编译单元里引用但是定义并不在本编译单元里的符号及其出现的地址。 
    导出符号表提供了本编译单元具有定义,并且愿意提供给其他编译单元使用的符号及其地址。 
    地址重定向表提供了本编译单元所有对自身地址的引用的记录。 
    链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定向表,对其中记录的地址进行重定向(即加上该编译 单元实际在可执行文件里的起始地址)。然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上 填写实际的地址(也要加上拥有该符号定义的编译单元实际在可执行文件里的起始地址)。最后把所有的目标文件的内容写在各自的位置上,再作一些别的工作,一 个可执行文件就出炉了。

http://blog.csdn.net/yby4769250/article/details/7360483

原文地址:https://www.cnblogs.com/feng9exe/p/8270024.html

时间: 2024-11-07 23:26:43

未解决符号表,导出符号表和地址重定向表的相关文章

符号管理之符号表

在符号表模块输出一个符号表类型Table和各种能符号表的实例 其中实例包括: Table constants Table externals Table identifiers Table globals Table types Table labels; 其中types表在第四章类型中会涉及 上述符号表的子集实现了ANSI  C的三种名字空间.identifiers保存一般的标识符:externals存放声明为extern的标识符,用于警告外部标识符声明冲突globals是identifier

获取Linux内核未导出符号的几种方式

从Linux内核的2.6某个版本开始,内核引入了导出符号的机制.只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用.然而,内核并没有导出所有的符号.例如,在3.8.0的内核中,do_page_fault就没有被导出. 而我的内核模块中需要使用do_page_fault,那么有那些方法呢?这些方法分别有什么优劣呢? 下面以do_page_fault为例,一一进行分析: 修改内核,添加EXPORT_SYMBOL(do_page_fault

使用导出导入(datapump)方式将普通表切换为分区表

随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式. 有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表:使用EXCHANGE PARTITION方式来转换为分区表以及使用DBMS_REDEFINITION来在线重定义分区表. 本文描写叙述的是使用导出导入方式来实现,以下是详细的操作演示样例. 有关详细的dbms_redefinition在线重定义表的原理及步骤可參考:基于 dbms_redefinition 在线重定义表       有关使用DB

用程序实现SQL的表导出

公司里面对公用数据库的访问有很多限制,因为涉及到性能问题.一般程序用到的就只有几张表.为了更自由地访问数据,一般都需要作数据导出. 用程序实现数据导出,有以下几个问题: 1 数据丢失 用程序导数据,特别是增量导数据,是容易丢失数据的.我的处理方法是利用数据库表的AddTime字段.每次增量导入时,从dest表中取得最大时间,如果不存在(空表),则指定人工指定一个时间点.导入的时间要比最大时间小几秒钟,我定义的是5秒. 2 数据插入冲突 数据插入冲突也是比较容易出现的问题,解决方法是Insert

【ORACLE】 11g 数据库表导出再导入10g 时空表不能导出的问题

问题:ORACLE 11g 将某用户自带表用 EXP 命令导出再IMP导入 10g 时 发现空表不能到导出 原因:11g 开始建表时,默认不分配 segment ,以节省空间,当表插入第一条数据时,再分配 segment 解决方法3个途径:1:向空白插入一条数据,再删除掉,就分配空间了(空表比较少).2:修改系统参数alter system set deferred_segment_create=false;   (对以后新增的表系统会分配 segment),重启数据库.3:批量对现有的空表分配

Shell脚本实现DB2数据库表导出到文件

该Shell脚本用于实现将DB2数据库表导出到文件,将在另一篇博文<Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件>中通过Java代码实现调用该脚本并传入参数. 1 #!/usr/bin/env sh 2 3 DBSCHEMA=$1 4 DBUSER=$2 5 DBPASSWORD=$3 6 TABLENAME=$4 7 FILEPATH=$5 8 DELIMITER=$6 9 EXPORTLIMIT=$7 10 11 SQLERR="NO ERROR MSG&

Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import

c#自带压缩类实现数据库表导出到CSV压缩文件的方法

原文:c#自带压缩类实现数据库表导出到CSV压缩文件的方法 在导出大量CSV数据的时候,常常体积较大,采用C#自带的压缩类,可以方便的实现该功能,并且压缩比例很高,该方法在我的开源工具DataPie中已经经过实践检验.我的上一篇博客<功能齐全.效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server.SQLite.ACCESS三种数据库),每月借此处理数据5G以上>中有该工具的完整源码,有需要的同学可以看看. 在.net 4.5中,可以轻松创建zip文件 ,首先需要引入 Sys

Linux内核导出符号宏定义EXPORT_SYMBOL的源码分析

源代码: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX "" #endif --. struct kernel_symbol       //内核符号结构 { unsignedlong value;  //该符号在内存地址中的地址 constchar *name;     //该符号的名称 }; -- #define __EXPORT_SYMBO