主函数总是在同一地址加载,而variables在大多数情况下有不同的地址?

我今天写了这个小程序,结果被我吹走了。 这是程序

int main(int argc,char **argv) { int a; printf("ntMain is located at: %p and the variable a is located at address: %p",main,&a); return 0; }

在我的机器上,主函数总是被加载到地址“0x80483d4”,并且variables的地址不断变化。这是怎么发生的? 我在操作系统中读到,作为虚拟化scheme的一部分,操作系统一直在重定位指令的地址。 那么为什么每次我运行这个程序时,主要被加载在同一个地址?

在此先感谢家伙。

如何打印进程在C中使用的内存的每个字节?

环境variables地址的随机化

在C#中获取线程的外部进程的起始地址

如何获得可靠的x86_64位linux系统的内存映射

如何在Linux中解码/ proc / pid / pagemap条目?

从内存中获取地址以在源代码中运行

multithreadingLinux进程的地址空间布局

在Linux中查找共享库的加载地址

将限制设置为Linux中可用的总物理内存

我们如何指定variables的物理地址?

在诸如Linux的ELF系统上,正常可执行文件(ELF类型ET_EXEC )加载段的地址在编译时是固定的。 像库这样的共享对象(ELF类型ET_DYN )被构建为位置无关的,其段可以在地址空间中的任何地方加载(可能对某些体系结构有一些限制)。 可以构建可执行文件,使得它们实际上是ET_DYN – 这些文件被称为“位置无关的可执行文件”(PIE),但不是常用的技术。

你所看到的是你的main()函数在你编译的可执行文件的固定地址文本段中。 在通过dlsym()定位之后,试着打印一个库函数的地址,例如printf() – 如果你的系统确实支持并启用了地址空间布局随机化(ASLR),那么你应该看到这个函数的地址从运行你的程序运行。 (如果你直接在你的代码中直接输入引用,就可以打印出库函数的地址,实际上你可能得到的是函数的过程查询表(PLT)trampoline的地址,它是静态编译在你的可执行文件中的一个固定地址。)

您看到的变量是从运行到运行的地址,因为它是在堆栈上创建的自动变量,而不是静态分配的内存。 根据操作系统和版本的不同,即使没有ASLR,堆栈基地址也可能会从运行转换为运行。 如果将变量声明移到函数外的全局变量中,您将看到它的行为与main()函数的行为相同。

下面是一个完整的例子 – 用gcc -o example example.c -dl编译:

#include <stdio.h> #include <dlfcn.h> int a = 0; int main(int argc,char **argv) { int b = 0; void *handle = dlopen(NULL,RTLD_LAZY); printf("&main: %p; &a: %pn",&main,&a); printf("&printf: %p; &b: %pn",dlsym(handle,"printf"),&b); return 0; }

main(...)是一个运行时启动库代码,其中操作系统每次加载并执行。 看看CRT(C运行时库),它将包含代码来执行此操作取决于您的编译器。

另一件需要牢记的地方 – 只要C代码有效,我不会过多担心。 这是一个侥幸模式,依赖于许多因素的顺序,如操作系统负载,使用的驱动程序,硬件,防病毒软件等…

另外,与代码相关的是,如果添加静态变量,函数,指针,这将改变二进制代码的布局,更重要的是,那些在运行时加载的符号的地址将会不同。

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

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: &#39; Style=&quot;position: relative&quot; AppendDataBoundItems=&quot;True&quot;&gt; (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke &#39;*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you
以下内容来源于: http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx 问:为什么Session在有些机器上偶尔会丢失? 答:可能和
以下文章提到可以用“http://localhost/MyWebApp/WebAdmin.axd”管理站点: ---------------------------------------------
Visual Studio 2005 IDE相关的11个提高开发效率的技巧 英文原创来源于: http://www.chinhdo.com/chinh/blog/20070920/top-11-vis
C#日期格式化 from: http://51xingfu.blog.51cto.com/219185/46222 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007
from: http://www.nikhilk.net/UpdateControls.aspx Two controls that go along with the UpdatePanel and
Open the report in the Designer. In the ToolBox, select/expand the &quot;Report Items&quot; section.
from: http://drupal.org/node/75844 Do this: find which TinyMCE theme you are using. For the sake of
asp.net中给用户控件添加自定义事件 用户控件中定义好代理和事件: public delegate void ItemSavedDelegate(object sender, EventArgs
在Windows版本的Safari中浏览以下的页面。 http://www.asp.net/AJAX/Control-Toolkit/Live/Calendar/Calendar.aspx Calen
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx By Scott Mitchell Introduction When creating