Reorganize floats and equations flow
This commit is contained in:
parent
d4f417017e
commit
d031d8ec49
1 changed files with 25 additions and 21 deletions
|
@ -39,6 +39,8 @@ Under supervision of Francesco Zappa Nardelli, March -- August 2018\\
|
||||||
%\renewcommand\theadgape{\Gape[4pt]}
|
%\renewcommand\theadgape{\Gape[4pt]}
|
||||||
%\renewcommand\cellgape{\Gape[4pt]}
|
%\renewcommand\cellgape{\Gape[4pt]}
|
||||||
|
|
||||||
|
\allowdisplaybreaks{}
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
@ -271,6 +273,26 @@ IP of the current FDE if it was the last row. In particular, there can be no
|
||||||
``IP hole'' within a FDE --~unlike FDEs themselves, which can leave holes
|
``IP hole'' within a FDE --~unlike FDEs themselves, which can leave holes
|
||||||
between them.
|
between them.
|
||||||
|
|
||||||
|
For instance, the C source code in Listing~\ref{lst:ex1_c}, when compiled
|
||||||
|
with \lstbash{gcc -O1 -fomit-frame-pointer -fno-stack-protector}, yields the
|
||||||
|
assembly code in Listing~\ref{lst:ex1_asm}. The memory layout of the stack
|
||||||
|
frame is presented in Table~\ref{table:ex1_stack_schema}, to help understanding
|
||||||
|
how the stack frame is constructed. When interpreting the generated \ehframe{}
|
||||||
|
with \lstbash{readelf -wF}, we obtain the (slightly edited)
|
||||||
|
Listing~\ref{lst:ex1_dw}. During the function prelude, \ie{} for $\mhex{615}
|
||||||
|
\leq \reg{rip} < \mhex{619}$, the stack frame only contains the return address,
|
||||||
|
thus the CFA is 8 bytes above \reg{rsp}, and the return address is precisely at
|
||||||
|
\reg{rsp} --~that is, stored between \reg{rsp} and $\reg{rsp} + 8$. Then, the
|
||||||
|
contents of \lstc{fibo}, 8 integers of 4 bytes each, are allocated on the
|
||||||
|
stack, which puts the CFA 32 bytes above \reg{rsp}; the return address still
|
||||||
|
being 8 bytes below the CFA\@. The variable \lstc{pos} is optimized out in the
|
||||||
|
generated assembly code, thus no stack space is allocated for it. Yet,
|
||||||
|
\prog{gcc} decided to allocate a total space of 48 bytes for the stack frame
|
||||||
|
for memory alignment reasons, which means subtracting 40 bytes to \reg{rsp}
|
||||||
|
(address $\mhex{615}$ in the assembly). Then, by the end of the function, the
|
||||||
|
local variables are discarded and \reg{rsp} is reset to its value from the
|
||||||
|
first row.
|
||||||
|
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\begin{minipage}{0.45\textwidth}
|
\begin{minipage}{0.45\textwidth}
|
||||||
\lstinputlisting[language=C, firstline=3, lastline=12,
|
\lstinputlisting[language=C, firstline=3, lastline=12,
|
||||||
|
@ -294,7 +316,7 @@ between them.
|
||||||
\end{minipage}
|
\end{minipage}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{table}[h]
|
\begin{table}[h!]
|
||||||
\centering
|
\centering
|
||||||
\begin{tabular}{|c|c|c|c|c|c}
|
\begin{tabular}{|c|c|c|c|c|c}
|
||||||
\stackfhead{+ \mhex{30}}
|
\stackfhead{+ \mhex{30}}
|
||||||
|
@ -316,26 +338,6 @@ between them.
|
||||||
\caption{Stack frame schema for fib7 (horizontal layout)}\label{table:ex1_stack_schema}
|
\caption{Stack frame schema for fib7 (horizontal layout)}\label{table:ex1_stack_schema}
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
For instance, the C source code in Listing~\ref{lst:ex1_c}, when compiled
|
|
||||||
with \lstbash{gcc -O1 -fomit-frame-pointer -fno-stack-protector}, yields the
|
|
||||||
assembly code in Listing~\ref{lst:ex1_asm}. The memory layout of the stack
|
|
||||||
frame is presented in Table~\ref{table:ex1_stack_schema}, to help understanding
|
|
||||||
how the stack frame is constructed. When interpreting the generated \ehframe{}
|
|
||||||
with \lstbash{readelf -wF}, we obtain the (slightly edited)
|
|
||||||
Listing~\ref{lst:ex1_dw}. During the function prelude, \ie{} for $\mhex{615}
|
|
||||||
\leq \reg{rip} < \mhex{619}$, the stack frame only contains the return address,
|
|
||||||
thus the CFA is 8 bytes above \reg{rsp}, and the return address is precisely at
|
|
||||||
\reg{rsp} --~that is, stored between \reg{rsp} and $\reg{rsp} + 8$. Then, the
|
|
||||||
contents of \lstc{fibo}, 8 integers of 4 bytes each, are allocated on the
|
|
||||||
stack, which puts the CFA 32 bytes above \reg{rsp}; the return address still
|
|
||||||
being 8 bytes below the CFA\@. The variable \lstc{pos} is optimized out in the
|
|
||||||
generated assembly code, thus no stack space is allocated for it. Yet,
|
|
||||||
\prog{gcc} decided to allocate a total space of 48 bytes for the stack frame
|
|
||||||
for memory alignment reasons, which means subtracting 40 bytes to \reg{rsp}
|
|
||||||
(address $\mhex{615}$ in the assembly). Then, by the end of the function, the
|
|
||||||
local variables are discarded and \reg{rsp} is reset to its value from the
|
|
||||||
first row.
|
|
||||||
|
|
||||||
However, DWARF data isn't actually stored as a table in the binary files, but
|
However, DWARF data isn't actually stored as a table in the binary files, but
|
||||||
is instead stored as in Listing~\ref{lst:ex1_dwraw}. The first row has the
|
is instead stored as in Listing~\ref{lst:ex1_dwraw}. The first row has the
|
||||||
location of the first IP in the FDE, and must define at least its CFA\@. Then,
|
location of the first IP in the FDE, and must define at least its CFA\@. Then,
|
||||||
|
@ -349,6 +351,8 @@ unwinding a frame from an IP close to the end of the frame will require
|
||||||
evaluating pretty much every DWARF row in the table before reaching the
|
evaluating pretty much every DWARF row in the table before reaching the
|
||||||
relevant information, slowing down drastically the unwinding process.
|
relevant information, slowing down drastically the unwinding process.
|
||||||
|
|
||||||
|
\FloatBarrier{}
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{How big are FDEs?}
|
\subsection{How big are FDEs?}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue