This commit is contained in:
Kagura 2024-07-01 21:43:58 +08:00
parent 2243e58c1c
commit 161bd48446
2 changed files with 24 additions and 10 deletions

Binary file not shown.

View file

@ -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>}