【问题标题】:Decouple compile and linking into two steps将编译和链接解耦为两个步骤
【发布时间】: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


【解决方案1】:

通常您不应显式使用ld(或gold 或任何其他链接器),因为调用行非常依赖于目标且易碎。只需链接gcc

gcc -Wl,-rpath=$PWD -m32 main.o libvector.so -o prog

在您的特定情况下,您可能缺少处理程序启动和 libc 设置的 crt 目标文件(添加 -v 以查看实际的 ld 调用行)。

【讨论】:

  • 使用-nostdlib 链接共享库也是假的。
  • @EmployedRussian 是的,忘了说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多