问题
still struggling to understand the relocation entry in Relocatable Object Files, let's say I have this simple C program:
//main1.c
void functionTest();
functionTest(){
...
}
int main()
{
functionTest();
return 0;
}
my questions are:
Q1. since everything is known to main1, so there is no relocation entry in .rel.text or .rel.data section of main1.o, is my understanding correct?
Q2. below is a picture illustrates how DLL works,
for libc.so, everything is known(it has all definitions just like main1), so why there is still relocation entries in libc.so? I can understand the symbol table information needs to be copied because they exist, how can you copy something that doesn't exist?
Q3. lets say below is the relocation entry structure;
typedef struct {
int offset; /* Offset of the reference to relocate */
int symbol:24, /* Symbol the reference should point to */
type:8; /* Relocation type */
} Elf32_Rel;
so my understanding is there is already a relocation entry in main2.o for printf(), so the offset will be something like 8 or 9 bytes offset from caller function, symbol will be 'printf', type is R_386_PC32, so if there is another one needs to be copied from libc.so to main2.o, what's the structure of that relocation entry?
回答1:
Q1: Yes, if you compile the main1.c
in your question, it will build without the need to link in anything, because it's not using functions that are defined elsewhere.
Q2: That diagram won't apply to building main1.c
, because main1.c
does not use external functions. But, in a program that does have a call to, say, printf()
, here's what's going on: the diagram shows that relocation entries about libc.so
are being placed into main2.o
. You ask "why there is still relocation entries in libc.so?" but the relocation entries are not being put into libc.so
; they are being put into main2.o
, and they refer to things in libc.so
.
Q2 follow-up #1: When you say "for libc.so, everything is known", that is true only within libc.so
. Anything that uses a function defined in libc.so
will not know how that function is defined, until linking takes place. That's the function of ld
: to copy reference info from a library like libc.so
into a program being built, like main2
in the diagram. The reference info allows the kernel executing main2
to also load libc.so
into memory in such a way that execution can flow from the main2
code over to the libc.so
code and back to main2
wherever main2
calls a function whose definition / code resides in libc.so
.
Q3: I think the best way to put it is this: The information that is used to populate the relocation structure within main2.o
comes from libc.so
. Where I say that relocation entries are copied from libc.so
, that's what I mean: information about the target (e.g. printf()
) is taken from libc.so
and used to provide values for the relocation entry in main2.o
whose purpose is to tell the loader where to load the code for printf()
from.
Q3 follow-up #1: There is another sense in which libc.so
has relocation entries: the thing that built libc.so
added relocation entries to libc.so
, so that anything that wants to use its (exportable) functions and variables can do so. These don't need to be copied anywhere. Part of building an object file is to create information for internal things that other programs might use; and, part of building a program is to populate the information about external things that it makes use of. But the diagram looks to me like it's only meant to show that information about libc.so
and libvector.so
are added to main2.o
so that the loader can load all the needed code into memory when main2
is executed.
来源:https://stackoverflow.com/questions/53217849/relocation-entry-in-linking-c-programming