Open hyunsik-yoon opened 1 year ago
C -> assembler -> obj
$ gcc -S hello.c
--> hello.s
(어셈블리) 생성됨.
$ gcc -C hello.c
--> hello.o
(object) 파일을 생성
obj 파일 포맷
.text
segment: code
.data
segment: global data
relocation info & symbol table
liker will use to find where, e.g., printf, is
printf()
같은 것을 main() 에서 사용하면, printf()
코드가 executable에 포함되게 $ g++ -c foo.cc -o foo.o // Compile foo.cc into an object file
$ ar rcs libfoo.a foo.o // Create a static library from foo.o
# ar: create and manipulate static libraries
# 'ar' means 'archiever'. 옛날에는 object file들을 archive하는 용도로 썼다나..
$ g++ main.cc libfoo.a -o main -static
$ g++ -shared -o libfoo.so foo.cc
$ g++ -o main main.cc -L. -lfoo
# -L. : search current dir
# -lfoo : link libfoo.so
libfoo.so.1.0.1
orlibfoo-1.0.so
(lib
, library 이름, 버젼)libfoo.so.1
(soname) --> libfoo.so.1.0.1
file
명령어로 보면 static 이라고 나온다.readelf
출력에 shared
같은 스트링이 존재하지 않음
objdump -D
(assembly dump) 하면 사이즈가 매우 크다. 내용을 열어보면 사용한 함수들이 실제 이 파일 안에 있는 주소에 있다.
@PLT
라고 postfix 가 붙어있음return
류의 instruction이 있어야 한다든지%rax
register에 저장하고 리턴해야 한다든지.$ nm [obj file]
식으로 볼 수 있음 dynamic_cast
등을 수행하기 위 사용됨typeid
지원. dynamic_cast
지원. exception type에 따라 맞는 handler를 찾아가게 하기 위해.1. Use LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/library/
2. Use rpath or runpath:
-rpath
option to the linker (ld
) embeds a search path in the binary itself. The linker uses this path to find libraries at runtime. This is usually set at compile time, like this:gcc -o myprog myprog.c -Wl,-rpath,/path/to/your/library/
3. Place the library in a standard location:
place the library in, e.g., /usr/lib
or /usr/local/lib
3 Use LD_PRELOAD:
export LD_PRELOAD=/path/to/your/library/libYourLib.so
LD_LIBRARY_PATH
is preferred.
export LD_PRELOAD=/home/patric/libselinux.so.1
# then..
$ >ldd /bin/ls
...
libselinux.so.1 => /home/patric/libselinux.so.1 (0x00007fb9245d8000)
#include <dlfcn.h>
#include <iostream>
// Assume libfoo.so defines a function with the following prototype:
// void foo();
int main() {
// Load the shared library.
void* handle = dlopen("libfoo.so", RTLD_LAZY);
if (!handle) {
std::cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}
// Clear any existing error
dlerror();
// Load the symbol (function).
typedef void (*foo_t)();
// cast to correct type (takes a guess and double-checks with a run-time dynamic cast)
foo_t foo = (foo_t) dlsym(handle, "foo");
const char *dlsym_error = dlerror();
if (dlsym_error) {
std::cerr << "Cannot load symbol 'foo': " << dlsym_error << '\n';
dlclose(handle);
return 1;
}
// Now we can call the function using the function pointer
(*foo)();
// Unload the library.
if (dlclose(handle) != 0) {
std::cerr << "Cannot close library: " << dlerror() << '\n';
return 1;
}
return 0;
}
-ldl
$ g++ main.cpp -ldl -o main
참조: https://www.youtube.com/watch?v=N2y6csonII4 https://www.youtube.com/watch?v=UdMRcJwvWIY https://www.youtube.com/watch?v=8pwbFFBmM-k https://stackoverflow.com/questions/2937273/questions-about-name-mangling-in-c