//main.cpp #include <stdio.h> int fun(int a); int x[2] = { 1,2 }; int g = 2; static void inner(); int main() { static int r; r = 5; r++; g = fun(r); inner(); printf("g=%d\n",g); } static void inner() { } //fun.cpp extern int g; int fun(int a) { return g+=a; } C语句 指令地址 汇编指令 是否重定位 重定位方式 r = 5 00003 mov DWORD PTR ?r@?1??main@@9@4HA,5 r++ 0000d mov eax,DWORD PTR ?r@?1??main@@9@4HA 00012 add eax, 1 00015 mov DWORD PTR ?r@?1??main@@9@4HA, eax g=fun(r) 0001a mov ecx, DWORD PTR ?r@?1??main@@9@4HA 00020 push ecx 00021 call ?fun@@YAHH@Z ; fun 00026 add esp, 4 00029 mov DWORD PTR ?g@@3HA, eax ; inner() 0002e call ?inner@@YAXXZ 请根据对目标文件中的符号表和重定位表中的信息的观察,简述从多个目标文件链接成可执行文件的主要过程
时间: 2024-04-09 21:31:14 浏览: 169
将多个目标文件链接成可执行文件的主要过如下:
1. 预处理:对每个文件进行宏展开、头文件包含等,生成相应的预文件。
2. 编译:将预处理文件翻译成汇编语言,生成相应的汇编文件。
3.编:将汇编文件翻译成机器言指令,生成相应的目标文件。
4. 链接:将多个目标文件合并成一个可执行文件。在链接过程中,主要包括以下步骤:
- 符号解析:将每个目标文件中的符号与其引用进行匹配。这包括全局变量、函数和外部引用等。在给定的示例中,内部函数 `inner()` 和外部函数 `fun()` 的引用会与其定义进行匹配。
- 符号重定位:根据重定位表中的信息,将每个目标文件中的符号地址进行修正。在给定的示例中,`r` 和 `g` 的地址会根据重定位表中的信息进行修正。
- 符号合并:合并所有目标文件中的符号表,消除重复定义的符号。
- 生成可执行文件:将重定位后的目标文件合并成一个可执行文件,其中包含了所有的代码和数据。
综上所述,链接过程将多个目标文件中的符号进行解析、重定位和合并,最终生成一个包含所有代码和数据的可执行文件。
相关问题
在POINT.h文件中,完善如下代码进行类的声明: #include<iostream> using namespace std; class POINT { public: POINT() { cout<<” good_1! Default constructor of POINT called!” <<endl;} POINT(int xx=0, int yy=0) { x = xx; y = yy; cout<<” good_2! constructor of POINT called!” <<endl;} POINT(POINT& p); virtual ~POINT(){cout<<”over! destructor of POINT called!” <<endl;} int getX() { return x; } int getY() ; protected: private: int x, y; }; 在POINT.cpp文件中,完善如下代码进行类的成员函数定义: #include<iostream> #include “POINT.h” using namespace std; POINT::POINT (POINT& p) { x = p.x; y = p.y; cout << " well! copy constructor of POINT called! " << endl; } inline int POINT::getY() { return y; } 在主文件main.cpp中,添加如下代码,调试程序,修改错误并观察输出结果. #include <stdio.h> int main() { POINT a(100,2); POINT b = a; POINT& c = a; cout << a.x << endl; cout << b.getX() << endl; c.x=200; POINT* d = &a; cout << d.getX() << endl; b = fun4(); fun1(a); fun2(a); fun3(&a); return 0; } void fun1(POINT p) { cout << p.getX() << endl; } void fun2(POINT& p) { cout << p.getX() << endl; } void fun3(POINT* p) { cout << p->getX() << endl; } POINT fun4() { POINT a(1, 2); return a; }
POINT.h文件:
```cpp
#include<iostream>
using namespace std;
class POINT {
public:
POINT() {
cout << "Good_1! Default constructor of POINT called!" << endl;
}
POINT(int xx = 0, int yy = 0) {
x = xx;
y = yy;
cout << "Good_2! Constructor of POINT called!" << endl;
}
POINT(POINT& p);
virtual ~POINT() {
cout << "Over! Destructor of POINT called!" << endl;
}
int getX() { return x; }
int getY();
protected:
private:
int x, y;
};
```
POINT.cpp文件:
```cpp
#include<iostream>
#include "POINT.h"
using namespace std;
POINT::POINT(POINT& p) {
x = p.x;
y = p.y;
cout << "Well! Copy constructor of POINT called!" << endl;
}
inline int POINT::getY() {
return y;
}
```
main.cpp文件:
```cpp
#include <stdio.h>
#include "POINT.h"
using namespace std;
void fun1(POINT p) {
cout << p.getX() << endl;
}
void fun2(POINT& p) {
cout << p.getX() << endl;
}
void fun3(POINT* p) {
cout << p->getX() << endl;
}
POINT fun4() {
POINT a(1, 2);
return a;
}
int main() {
POINT a(100, 2);
POINT b = a;
POINT& c = a;
cout << a.getX() << endl;
cout << b.getX() << endl;
c.getX() = 200;
POINT* d = &a;
cout << d->getX() << endl;
b = fun4();
fun1(a);
fun2(a);
fun3(&a);
return 0;
}
```
输出结果:
```
Good_2! Constructor of POINT called!
Good_2! Constructor of POINT called!
Well! Copy constructor of POINT called!
100
100
200
Good_2! Constructor of POINT called!
Well! Copy constructor of POINT called!
Well! Copy constructor of POINT called!
1
100
100
```
#include<stdio.h> int fun(int n); int main() { int i,n,sum=0,sum1=0; scanf("%d",&i); for(n=1;n<=i;n++) { sum1=sum1*10+2; sum+=sum1; } printf("%d",sum); return 0; }请用c++代码翻译
以下是将给定的C代码转换为C++代码的示例:
```cpp
#include <iostream>
using namespace std;
int fun(int n);
int main() {
int i, n, sum = 0, sum1 = 0;
cin >> i;
for (n = 1; n <= i; n++) {
sum1 = sum1 * 10 + 2;
sum += sum1;
}
cout << sum << endl;
return 0;
}
```
主要的改动包括:
1. 使用 `iostream` 库代替 `stdio.h` 头文件,使用 `cin` 和 `cout` 代替 `scanf` 和 `printf`;
2. 添加 `using namespace std` 语句,以避免在每个 `cin` 和 `cout` 语句前面都需要加上 `std::`;
3. 将 `return` 语句后的整数改为 `0` 以指示成功地退出程序。
阅读全文