Add
This commit is contained in:
parent
2243e58c1c
commit
161bd48446
2 changed files with 24 additions and 10 deletions
BIN
复习资料/A.pdf
BIN
复习资料/A.pdf
Binary file not shown.
34
复习资料/A.tex
34
复习资料/A.tex
|
@ -240,7 +240,9 @@ frac \(\ne 00\dots0\) 表示 NaN
|
|||
\end{table}
|
||||
|
||||
\pagebreak
|
||||
\vspace{-0.5em}
|
||||
\section{程序的机器级表示}
|
||||
\vspace{-1.5em}
|
||||
|
||||
\subsection{计算数组元素的地址}
|
||||
|
||||
|
@ -272,33 +274,44 @@ frac \(\ne 00\dots0\) 表示 NaN
|
|||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
\vspace{-5mm}
|
||||
\vspace{-3em}
|
||||
|
||||
\section{链接}
|
||||
\subsection{符号表 (.symtab)}
|
||||
|
||||
\vspace{-1em}
|
||||
\begin{table}[h]
|
||||
\begin{tabular}{l|c|c|c|c}
|
||||
\begin{tabular}{l|c|c|c|l}
|
||||
\hline
|
||||
C语言表示 & 类型 & 符号强度 & 节 & 说明\\ \hline
|
||||
\texttt{void swap();} & 全局 & 强 & \texttt{.text} & 函数在.text \\ \hline
|
||||
\texttt{extern int buf[];} & 外部 & --- & 实际定义所在位置 & 默认\texttt{UND}(未解析的引用符号) \\ \hline
|
||||
\texttt{int *bufp0 = \&buf[0]} & 全局 & 强 & \texttt{.data} & 初始化的全局变量\\ \hline
|
||||
\texttt{void swap();} & 全局 & 强 & \texttt{.text} & 非静态函数 \\ \hline
|
||||
\texttt{int a = 0;} & 全局 & 强 & \texttt{.bss} & 初始化为 0 的全局变量 \\ \hline
|
||||
\texttt{int *bufp0 = \&buf[0]} & 全局 & 强 & \texttt{.data} & 初始化为其他值的全局变量\\ \hline
|
||||
\texttt{int *bufp1;} & 全局 & 弱 & \texttt{COMMON} & 未初始化的全局变量 \\ \hline
|
||||
\texttt{extern int buf[];} & 外部 & --- & \texttt{UNDEF} & \makecell[l]{
|
||||
未解析的引用符号 \\
|
||||
位于实际定义所在位置
|
||||
} \\ \hline
|
||||
\begin{lstlisting}[language=C,gobble=8]
|
||||
void p() {
|
||||
static int i;
|
||||
static int j = 0; }
|
||||
\end{lstlisting}
|
||||
& 局部 & --- & \texttt{.bss} & \makecell[l]{未初始化的静态局部变量 \\ 初始化为 0 的静态局部变量} \\ \hline
|
||||
\begin{lstlisting}[language=C,gobble=8]
|
||||
void p() {
|
||||
static int i = 1; }
|
||||
\end{lstlisting}
|
||||
& 局部 & \makecell[c]{强\ ,不同\\函数可重} & \texttt{.data} 或 \texttt{.bss} & \makecell[l]{未初始化或初始化为0在 \ \texttt{.bss}\\初始化为其他在 \ \texttt{.data}} \\ \hline
|
||||
& 局部 & --- & \texttt{.data} & 初始化为其他值的静态局部变量 \\ \hline
|
||||
\begin{lstlisting}[language=C,gobble=8]
|
||||
void q() {
|
||||
int j = 2; }
|
||||
\end{lstlisting}
|
||||
& 都不是 & --- & 节里没有,在栈里 & 链接器不看局部\underbar{变量} \\ \hline
|
||||
& 都不是 & --- & 在栈上 & 链接不涉及非静态局部变量 \\ \hline
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
\vspace{-2em}
|
||||
\subsection{链接顺序}
|
||||
\vspace{-0.5em}
|
||||
\texttt{\$ gcc -static -o prog2c main2.o ./libvector.a} \\
|
||||
E 将被合并以组成可执行文件的所有目标文件集合\\
|
||||
U 当前所有未解析的引用符号的集合\\
|
||||
|
@ -306,8 +319,9 @@ D 当前所有定义符号的集合\\
|
|||
开始 E、U、D为空,首先扫描 \texttt{main2.o},将其加入 E,将未找到的符号加入 U, 定义的符号加入 D。 \\
|
||||
再扫描 \texttt{./libvector.a},将匹配到的 U 中的符号转移到 D 并加入到 E, 同时将未找到的符号加入 U。 \\
|
||||
最后搜索标准库 \texttt{libc.a},处理完\texttt{libc.a}时,U一定是空的,D中符号唯一,否则错误。
|
||||
|
||||
\vspace{-1.5em}
|
||||
\subsection{重定位}
|
||||
\vspace{-0.5em}
|
||||
PC相对地址下重定位值计算公式:\\
|
||||
\texttt{ADDR(r.symble)-((ADDR(.text)+r.offset)-r.addend)}\\
|
||||
在asm中表示为 \texttt{4004de: e8 \underbar{05 00 00 00} \quad callq 4004e8 <sum>}
|
||||
|
|
Loading…
Reference in a new issue