【发布时间】:2018-08-02 12:12:08
【问题描述】:
我有一个主文件,它调用共享库中定义的函数。
// main.c
int main()
{
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];
addvec(x, y, z, 2);
}
共享库如下代码
// addvec.c
void addvec(int *x, int *y, int *z, int n)
{
int i;
for(i = 0; i < n; ++i)
z[i] = x[i] + y[i];
}
我用gcc -shared -fpic -nostdlib -o libevctor.so addvec.c做了一个共享库。
然后我编译了 main.c 没有链接。
gcc -c main.c -o main.o
最后,我把这两部分联系起来了:
ld -rpath=$PWD -dynamic-linker /lib/ld-linux.so.2 -m elf_i386 -e main main.o libvector.so -o prog
到目前为止一切正常。但是,当我运行prog 时,会出现分段错误。
另外,我用readelf代替prog,发现.dynsym中addvec的值为0:
symbol table '.dynsym' consists of 5 entries:
Num: value: Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FUNC GLOBAL DEFAULT UND addvec
2: 0804934c 0 FUNC GLOBAL DEFAULT 10 __bss_start
....
我做错了什么吗?
【问题讨论】:
-
void addvec(int *x, int *y, int *z, 2)这是你的真实密码吗? -
@AlexF 感谢您的提醒。这是
int n。
标签: linker segmentation-fault static-linking dynamic-linking