我使用以下命令从以下C
代码构建了一个共享对象:
gcc -fPIC -shared libx.c -o libx.so
libx.c
extern int printf(const char *, ...);
int libvar = 250;
void libfunc(){
printf("%d,",libvar);
}
我使用以下命令将以下C
代码链接到libx.so
库:
gcc -no-pie -lx -L ./ -o main main.c
-no-pie : 告诉编译器生成一个ELF可执行文件而不是共享对象(因为这是我的编译器的默认设置)。
main.c
extern void libfunc();
int main(){
libfunc();
}
现在,当启动程序时,理论上,动态加载器将把共享库
libx.so
映射到运行进程(./main)的地址空间中,并解析符号libfunc
和libvar
(对于PIC
更改.got
和.plt
段中的内容),最终它将解析printf
符号,然后打印libvar
的值,即250
。但是程序却打印出了一些奇怪的值:
root@afr0ck:~# ./main; printf "\n"
-1076465840
我已经花了很长时间来进行调试,但是我无法弄清楚发生了什么!
-lx -L ./
,就会出现链接器错误。即使是这样,我还需要将库安装在/lib
中,因为它在当前工作目录中找不到。我使用的是Ubuntu 64位,也是6.3.0版本的。 - Antti Haapala -- Слава Україні/lib
中使用了错误的共享对象。我忘记复制新库了。 - Karim Manaouil