我在通過聯結器腳本將類鏈接到特定記憶體區域時遇到問題
我已經弄清楚如何鏈接類外的變數和函式,但我不知道如何將類鏈接到聯結器腳本中指定的記憶體區域
我的聯結器腳本非常簡單:
SECTIONS
{
. = 0x1000000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
主要代碼:
#include <iostream> // system
#include "mem.h"
using namespace std;
unsigned int A = 0xFFFF1234;
unsigned int B = 0x00001234;
void Function_A(void)
{
printf("This is execution of the void Function A \n");
}
void Function_B(int x)
{
x = x 1;
printf("This is execution of the void Function B with variable x:%d \n",x);
}
int main(int argc, char* argv[])
{
system("clear");
unsigned int * pA = &A;
unsigned int * pB = &B;
printf("Original Data A ---> 0xx\n",A);
printf("Original Data B ---> 0xx\n\n",B);
printf("Pointer to A variable ---> %p\n",pA);
printf("Pointer to B variable ---> %p\n\n",pB);
void (*pFunction_A)(void) = &Function_A;
void (*pFunction_B)(int) = &Function_B;
MemAssembly * pMemAssembly;
pMemAssembly->MemDump();
// Testing function pointers
pFunction_A();
pFunction_B(100);
(*pFunction_B)(200);
printf("Pointer to Function_A ---> %p\n",pFunction_A);
printf("Pointer to Function_B ---> %p\n\n",pFunction_B);
// Address is not linked !!!????
printf("Pointer to MemAssembly Class ---> %p\n\n",pMemAssembly);
return 0;
}
現在,當我執行時,我得到了這個:
Original Data A ---> 0xffff1234
Original Data B ---> 0x00001234
Pointer to A variable ---> 0x8000004
Pointer to B variable ---> 0x8000008
RAX_Accumulator ---> Read A : 0x00000000ffff1234
RAX_Accumulator ---> Read B : 0x0000000000001234
This is execution of the void Function A
This is execution of the void Function B with variable x:101
This is execution of the void Function B with variable x:201
Pointer to Function_A ---> 0x10000e9
Pointer to Function_B ---> 0x1000103
Pointer to MemAssembly Class ---> 0x7f282ab46764
mem.h 如下所示:
#ifndef MEM_H
#define MEM_H
#include <inttypes.h>
extern "C" unsigned long _MEMORY_READ_A(void);
extern "C" unsigned long _MEMORY_READ_B(void);
class MemAssembly{
public:
MemAssembly();
~MemAssembly();
int AssemblyMemoryDump(void);
void MemDump(void)
{
printf("RAX_Accumulator ---> Read A : %#018" PRIx64 " \n",_MEMORY_READ_A());
printf("RAX_Accumulator ---> Read B : %#018" PRIx64 " \n\n",_MEMORY_READ_B());
}
};
#endif /* MEM_H */
和組件
section .text
global _MEMORY_READ_A
_MEMORY_READ_A:
mov eax, [0x08000000 4]
ret
global _MEMORY_READ_B
_MEMORY_READ_B:
mov eax, [0x08000000 8]
ret
所以我的問題是:我應該如何修改鏈接描述檔案、mem.h 或程式集以便將我的類加載到特定的記憶體區域而不是使用動態分配???
而不是這個:
Pointer to MemAssembly Class ---> 0x7f282ab46764
讀取鏈接描述檔案中指定的地址???
uj5u.com熱心網友回復:
感謝彼得的幫助
這是我所做的:
在 ASM 中添加了 MemAssembly 部分
section .MemAssembly
global global_MemAssembly
global_MemAssembly:
將其與 0xb000000 鏈接
SECTIONS
{
. = 0x1000000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
. = 0xB000000;
.MemAssembly : { *(MemAssembly)}
}
使用測驗類
class MemAssembly{
public:
MemAssembly();
~MemAssembly();
int x,y,z,t;
long a,b,c,d;
long long dx,dy,dz,dt;
void MemDump(void)
{
printf("x ---> %p y ---> %p z ---> %p t ---> %p\n", &x, &y, &z, &t);
printf("a ---> %p b ---> %p c ---> %p d ---> %p\n", &a, &b, &c, &d);
printf("dx ---> %p dy ---> %p dz ---> %p dt ---> %p\n\n", &dx, &dy, &dz, &dt);
}
};
當我使用 usign 動態呼叫 MemDump() 時:
MemAssembly * pMemAssembly
我得到:
x ---> 0x7ffd7cc36040 y ---> 0x7ffd7cc36044 z ---> 0x7ffd7cc36048 t ---> 0x7ffd7cc3604c
a ---> 0x7ffd7cc36050 b ---> 0x7ffd7cc36058 c ---> 0x7ffd7cc36060 d ---> 0x7ffd7cc36068
dx ---> 0x7ffd7cc36070 dy ---> 0x7ffd7cc36078 dz ---> 0x7ffd7cc36080 dt ---> 0x7ffd7cc36088
但是當我使用時:
extern MemAssembly global_MemAssembly;
MemAssembly * pMemAssembly = &global_MemAssembly;
我得到:
x ---> 0xb000000 y ---> 0xb000004 z ---> 0xb000008 t ---> 0xb00000c
a ---> 0xb000010 b ---> 0xb000018 c ---> 0xb000020 d ---> 0xb000028
dx ---> 0xb000030 dy ---> 0xb000038 dz ---> 0xb000040 dt ---> 0xb000048
這是我所期望的
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/498475.html
上一篇:GDB如何知道優化的區域變數值?
下一篇:機器碼可以轉成jvm位元組碼嗎?
