当我想要一个共享库时,GCC输出一个可执行的ELF文件

Dav*_*own 5 c gcc shared-libraries elf cross-compiling

我正在尝试使用i686-elf交叉编译器在Cygwin中构建一个共享库.代码很简单:

int add(int a, int b) {
    return a + b;
}

void _init() {
    add(3, 4);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令进行编译:

i686-elf-gcc -fPIC -shared -nostdlib core.c -o libcore.so
Run Code Online (Sandbox Code Playgroud)

这应该是一个共享对象,对吧?但GCC会输出一个警告_start,指出无法找到符号,这是可执行文件的入口点,而不是共享对象.此外,readelf说如下:

$ readelf -a libcore.so
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  ...
  Type:                              EXEC (Executable file)
  ...
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

ser*_*rvn 3

问题本质上是你的目标是 i686-elf,而没有人为该目标构建共享库。 -Wl,-shared会给你一些被标记为共享库的东西,但是你到底打算如何在裸机目标上加载共享库呢?