Clang не принимает одновременно флаги компилятора -shared -fPI C -p ie - PullRequest
0 голосов
/ 05 мая 2020

Задано с помощью кода ниже:

#include <stdio.h>

void output()
{
  printf("hello \n");
}

int main()
{
  output();
  return 0;
}

Когда приведенный выше код компилируется с помощью команды ниже:

gcc hello.c -shared -fPIC -pie -o libhello.so -Wl,-E

Сгенерированный libhello.so не только общая библиотека, но также исполняемый файл. Однако при изменении g cc на clang , как показано ниже

clang-10 hello.c -shared -fPIC -pie -o libhello.so -Wl,-E

Компиляция выдает предупреждение ниже:

clang: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]

При выполнении libhello.so скомпилирован clang-10 , он тоже вылетел.

Вопрос: 1. Можно ли использовать clang compile runnable shared lib как g cc ?

Примечание: этот вопрос задается только для моего собственного любопытства, и я не сталкиваюсь с какой-либо практической проблемой.

1 Ответ

0 голосов
/ 10 мая 2020

Как предупреждение clang-10, clang-10 не генерирует объекты ниже, как компиляторы G CC:

  1. сегмент INTERP в заголовке программы общей библиотеки
  2. _start ( ) function

Оба они могут быть вручную, как показано ниже.

#include <stdio.h>

const char interp_section[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2";

void output()
{
  printf("hello \n");
}

int main()
{
  output();
  return 0;
}

void _start()
{
  printf("hello.c : %s\n", __FUNCTION__);
  exit(0);
}

Однако лучше использовать флаги -Wl,-e,YourEntryFunction для создания исполняемого общего объекта вместо подхода, представленного в выше вопрос.

...