diff --git a/复习资料/A.pdf b/复习资料/A.pdf index b57509a..b523c99 100644 Binary files a/复习资料/A.pdf and b/复习资料/A.pdf differ diff --git a/复习资料/A.tex b/复习资料/A.tex index 284b5bb..0492f63 100644 --- a/复习资料/A.tex +++ b/复习资料/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 }