我以为一个进程无法读取另一个进程的内存.但我很震惊地看到名为" WinHex " 的应用程序具有"Ram Editor"并且它能够访问整个内存.所有过程.
怎么可能?它甚至能够修改其他进程的内存.这不是恶意的吗?
我是新手程序员.我只想看到不同阶段的输出编译,汇编和链接.我也不懂汇编语言.
我写了一个简单的程序
#include <stdio.h>
int humans = 9;
int main()
{
int lions = 2;
int cubs = populate(lions);
return 0;
}
int populate(int crappyVariable)
{
return ++crappyVariable;
}
Run Code Online (Sandbox Code Playgroud)
我使用gcc - S sample.c汇编语言的输出感到惊讶.我丢失了所有变量名称和函数名称.
它保留了像人类,填充,主要的全局标识符,但它以下划线_为前缀.所以,我不认为它使用标识符.无论如何,重点是丢失了所有标识符.
我的问题是它如何调用函数或引用变量?
我对输出的更多阶段感到好奇,这些阶段将是二进制的(这是不可见的).
如何在组装之后和链接之前输出?我猜它甚至会松散下划线前缀全局标识符?那么问题是如何调用函数或引用变量进行操作?
我在互联网上搜索信息,但找不到任何有用的东西.可能我不知道该搜索什么.我不想读这本书的大书.但是如果有任何文章,教程清楚概念.这也会有所帮助.
我是新手程序员.所以,你可以用简单但技术性的术语来解释它.
编辑:作为回应,评论.我把问题分成了几个问题.这是这个问题的第二部分:不清楚链接器的工作
我在Windows上使用C语言.这个问题以前是程序中标识符会发生什么变化的一部分?.我打破它减少没有.问题 这是一个独立的查询(不依赖于前一个问题)
如果没有要链接的东西(即我没有使用任何库.我知道它没有任何用处.)链接器会更改汇编程序的目标代码输出吗?如果是这样,它会改变什么?
我听说LINKER也做了一些内存映射的操作.我不明白怎么做.该程序没有运行,它刚刚处于制造阶段.链接器如何映射到内存?它看起来怎么样?LINKER的功能是什么?
当人们提到"搬迁","地址绑定"时.我真的不明白他们的意思.它是什么?它的目的是什么?
一些调试器显示如下信息:调用堆栈:0xfffef32,0xf3234fe等.它在运行时是否正确?或者是链接器所谓的"内存映射"的内存地址?
当人们提到类似symbols或symbol table.它们是指标识符(变量名,常量名,函数名)吗?
我在互联网上搜索信息,但找不到任何有用的东西.可能我不知道该搜索什么.我不想读这本书的大书.但是如果有任何文章,教程清楚概念.这也会有所帮助.
我是新手程序员.所以,你可以用简单但技术性的术语来解释它.