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