`
ouyida3
  • 浏览: 50106 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在linux上替换动态库的内存变化分析

阅读更多

在linux上替换动态库的内存变化


测试static变量:
static string staticString = "123";
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    staticString = GetString(inBuf,"SEND_DESC");
    }
    else
    {
    outBuf.SetString("OPER_DESC",staticString);
    }
}

当send_code传入非1时,可以传入send_desc修改staticString的值,假设修改为"456"后,每次查询OPER_DESC的返回都是新的值"456"。证明static起作用。

然后,重新替换so动态库(queryFreezingMoney函数编译在动态库中),替换后和替换前的动态库中代码是完全一样,此时再调用,OPER_DESC返回"123"。证明替换动态库,即使不重启程序,也会使得全局数据区的内存重新加载。

单例和static有点相似,他们在内存区一样吗?
不一样。单例是new创建的,它在堆区;static在上一篇文章说了,在全局数据区。

所以,接着我们需要测试,替换了动态库,堆区的内存是如何变化的。

ArchQuery.h
class ArchQuery
{
public:
    static string singletonString;
};

ArchQuery.cpp
string ArchQuery::singletonString = "abc";


ArchQueryMgr.cpp
typedef Singleton<archquery::ArchQuery> ArchQueryHolder;
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    ArchQueryHolder::getInstance().singletonString = GetString(inBuf,"SEND_DESC");
    }
    else
    {
    outBuf.SetString("OPER_DESC",ArchQueryHolder::getInstance().singletonString);
    }
}

结论同上。
singletonString初始化为abc,可以修改为def,替换动态库后,又重新变为abc。


最后,测试单例非static变量:
ArchQuery.h
class ArchQuery
{
public:
    string singletonString;
    void setSingletonString(string str)
    {
    singletonString = str;
    }
};

ArchQueryMgr.cpp
typedef Singleton<archquery::ArchQuery> ArchQueryHolder;
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    ArchQueryHolder::getInstance().setSingletonString(GetString(inBuf,"SEND_DESC"));
    }
    else
    {
    outBuf.SetString("OPER_DESC",ArchQueryHolder::getInstance().singletonString);
    }
}

singletonString没有初始化值,可以通过传入SEND_DESC首先把singletonString的值设为def,替换动态库后,值依然为def!
结论,替换动态库并不能使堆区的内存变化。

总结:
1 一般的static变量,替换了动态库会重新加载
2 如果是单例的static变量,替换了动态库会重新加载
3 如果是单例的非static变量,替换了动态库不会重新加载



===================
附录:

环境:
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel 2.6.32-279.el6.x86_64 on an x86_64

编译器 :
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)


顺带说一下,这个问题在aix上是都会重新加载的。所以两个平台迁移的时候要注意了。

AIX Version 5.3
aix编译器:
  xlC.adt.include            9.0.0.0    C     F    C Set ++ Application
  xlC.aix50.rte             10.1.0.3    C     F    XL C/C++ Runtime for AIX 5.3
  xlC.cpp                    9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.ZH_CN.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.rte         10.1.0.3    C     F    XL C/C++ Runtime
  xlC.msg.zh_CN.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.rte                   10.1.0.3    C     F    XL C/C++ Runtime

===============

再附两个报错信息:

static string singletonString;// 注意,这里不能初始化,否则会报错
报错:
ArchQuery.h:15: error: invalid in-class initialization of static data member of non-integral type 'std::string'

然后ArchQuery.cpp必须定义:
string ArchQuery::singletonString;

否则会报错。

分享到:
评论

相关推荐

    Linux动态函式库解析.pdf

    2. **易于升级和维护**:当动态函式库中的函数实现发生变化时,只需替换该动态库文件即可,而无需重新编译和链接所有依赖它的程序。 3. **节省内存资源**:多个进程可以共享同一个动态函式库的实例,从而减少物理...

    hoard-37.tar.gz_linux Hoa_linux Hoard

    在Linux环境中,Hoard可以通过编译选项或者动态链接库的方式被应用程序所使用。开发者可以按照Hoard提供的文档进行配置和编译,替换默认的内存管理器。在多线程、高性能计算或者大数据处理等场景中,Hoard能够显著...

    linux/unix系统编程手册附录代码

    《Linux/Unix系统编程手册》是一本深受程序员和系统管理员喜爱的经典著作,它详细阐述了在Linux和Unix操作系统上进行低级编程的各种技术。附录中的代码是书中的实例,旨在帮助读者深入理解和掌握这些系统编程的核心...

    Porting_from_Linux_sample_code.zip

    5. 内存管理:Linux的动态内存分配(如`malloc()`、`free()`)需要替换为Symbian的New/Lite和Delete/Lite操作。 6. 异常处理:Linux通常使用C++标准异常,Symbian则有其特有的错误处理机制,如SetError()和User::...

    Linux_Unix环境中ELF格式病毒的分析.pdf

    - **地址无关代码(PIC)**:由于Unix系统通常采用动态链接,病毒体需要使用位置无关代码(PIC)技术,确保其在不同内存位置下都能正确执行。 - **LKMs可重载内核技术**:病毒可能利用LKMs来替换或扩展系统功能,以...

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

    Linux程序员指南

    - 内核是Linux的核心,即使替换所有的库,只要内核不变,系统仍然是Linux。 - 内核包含了设备驱动程序、内存管理、进程管理和通信管理等功能。 2. **内核的遵守规则:** - 内核开发者遵循POSIX标准,这些标准...

    内存管理内存管理内存管理

    在 32-位 x86 系统上,每一个进程可以访问 4 GB 内存。现在,大部分人的系统上并没有 4 GB 内存,即使您将 swap 也算上,每个进程所使用的内存也肯定少于 4 GB。因此,当加载一个进程时,它会得到一个取决于某个...

    Linux C编程一站式学习 pdf

    - **共享库**: 在运行时动态加载的库。 - **虚拟内存管理**: 如何管理和使用虚拟内存空间。 **2.8 预处理** - **预处理的步骤**: 包括宏替换、文件包含等。 - **宏定义**: 定义常量、函数等。 - **条件预处理指示**...

    LINUX 贪吃蛇

    开发者会利用标准输入输出(stdin和stdout)以及控制台的ANSI转义序列来控制屏幕上的字符移动和颜色变化,实现游戏元素的动态显示。 ### 二、游戏原理 1. **游戏循环**:贪吃蛇游戏的核心是一个无限循环,用于不断...

    linux程序员指南

    - **内核概念**:Linux的核心是其内核,用户可以替换库或所有库,但只要Linux内核存在,那么仍然是Linux系统。内核包括设备驱动程序、内核管理、进程管理和通信管理等功能。 - **遵循POSIX规则**:内核设计者通常...

    linux 内核 编程

    - **编译过程**:内核模块不是独立可执行文件,而是动态链接库(DLL)。它们通过特定的命令行工具(如`make`)来编译,并且最终生成`.ko`文件。 - **配置文件**:通常需要一个名为`Makefile`的配置文件来指定编译...

    Linux内核模块的编写及技巧小谈.pdf

    此外,文档还提到了初学者在编译过程中可能会遇到的问题以及解决方法,例如,内存复制函数的命名变化,如`memcpy_fromfs`和`memcpy_tofs`在某些新版本内核中被替换为`copy_from_user`和`copy_to_user`。 在编译内核...

    jdk-11.0.4_linux-x64_bin.rar

    1. **模块化系统(Project Jigsaw)**:这是JDK11中最显著的变化,它引入了Java平台模块系统(JPMS),使得大型代码库的组织和管理更加有序。通过模块化,可以提高代码的封装性和可维护性,减少类路径冲突,同时优化...

    LINUX常见问题详细解答

    - `top`:动态显示进程变化。 - `kill`:发送信号给进程。 - `nice`:设置进程优先级。 ### 四、故障排查与优化 #### 8. 日志文件分析 - `/var/log/messages`:记录系统日志。 - `/var/log/syslog`:记录系统和...

    嵌入式软件开发技术:第3章 嵌入式Linux多任务编程.ppt

    动态性,指的是进程在其生命周期内状态会不断变化;交互性,进程间可以通过各种方式通信;以及独立性和异步性,每个进程拥有独立的地址空间,且执行速度不可预测。 Linux将所有的进程组织成一个双向循环链表,每个...

    基於Linux 核心模式之Rootkit 惡意軟體的隱藏及偵測技術

    - **动态链接库(DLL)注入**:在Windows环境中常见,通过将恶意代码注入到合法进程中执行,实现对系统的隐秘控制。 ##### (二) Linux核心模式Rootkit的技术 Linux核心模式Rootkit通常利用Loadable Kernel Module ...

Global site tag (gtag.js) - Google Analytics