这是来自Linux手册页的代码:
#include <stdio.h>
#include <stdlib.h>
extern char etext, edata, end;
int main() {
printf("First address past:\n");
printf(" program text (etext) %10p\n", &etext);
printf(" initialized data (edata) %10p\n", &edata);
printf(" uninitialized data (end) %10p\n", &end);
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
运行时,下面的程序产生如下输出:
$ ./a.out
First address past:
program text (etext) 0x8048568
initialized data (edata) 0x804a01c
uninitialized data (end) 0x804a024
Run Code Online (Sandbox Code Playgroud)
在哪里etext,edata end界定?如何为这些符号赋值?它是由链接器还是别的?
给定Windows进程句柄,如何使用C++代码确定进程是32位还是64位?
我在微软的Spider Solitaire上使用它来测试整个基本/静态指针.所以我得到了玩家使用的"移动"量的基本指针,并且作弊引擎告诉我它是"SpiderSolitaire.exe + B5F78".所以现在我不知道如何弄清楚SpiderSolitaire.exe的起始地址是什么(当然每次程序启动时这都会改变).如何找到SpiderSolitaire.exe的起始地址,以便我可以添加偏移量并获取"移动"值的实际地址(当然是用c ++)?
几个月前,我遇到了一个人(在orkut上)提出的有趣场景.虽然,我已经想出了一个解决这个问题的"非便携式"解决方案(用小代码测试过),但仍然想知道你们要说些什么并提出建议.
假设,我创建了一个DLL,导出一些用C++编写的功能,用于单线程客户端.这个DLL声明了很多全局变量,有些可能是const变量(只读)而其他变量是可修改的.
无论如何,后来的事情发生了变化,现在我想让同一个DLL与多线程应用程序一起工作(不修改DLL); 这意味着,几个线程从DLL访问函数和全局变量,并修改它们等等.所有这些都可能导致全局变量保持不一致的值.
所以问题是,
我们可以在客户端代码中做些什么来阻止DLL的多次访问,同时确保每个线程在它自己的上下文中运行(意味着,当它访问DLL时,DLL的全局值与它之前)?
我怎么能告诉静态的Visual C ++放置一个全局变量在内存中的一个给定的绝对地址,像什么__attribute__((at(address)))呢?
我们必须在开发过程中使用第三方DLL,遗憾的是我们无法修改它或指定库必须如何工作.
原始库开发人员通过静态变量在他们的方法中引入了状态机制.
例如:
void foo()
{
static int a = 1;
if (a == 1)
{
/* some init logic */
a = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
有时我们需要将库带到其原始状态.
有没有办法将静态变量重置为原始值而没有任何系统"黑客"?
我们当前的解决方案是FreeLibrary/LoadLibrary,但我们想避免它.
我需要在运行时获取数据段的bss和数据部分的地址空间.我需要每个部分的开始和结束地址.
c++ ×5
c ×2
winapi ×2
windows ×2
32bit-64bit ×1
base-address ×1
gcc ×1
ld ×1
linker ×1
memory ×1
mutex ×1
process ×1
unix ×1
visual-c++ ×1