Простая программа на C не будет компилироваться — ошибка «динамические основные исполняемые файлы должны быть связаны с libSystem.dylib для архитектуры i386»

#c #gcc

#c #gcc

Вопрос:

macOS Catalina 10.15.3 2.6 ГГц 6-ядерный процессор Intel Core i7

Я следую вместе с учебником по информатике и пытаюсь скомпилировать простую программу на языке ассемблера, чтобы я мог видеть, что происходит под капотом. Я делаю это, используя 32-разрядную архитектуру, поскольку это то, что текст использует для своей компиляции (это старая книга), но я запускаю это на 64-разрядной машине. Поскольку я просто прошу компилятор вывести файл (не запускать его), я бы не ожидал, что это будет проблемой.

У меня есть следующая программа в файле с именем sum.c :

 
int accum = 0;

int sum(int x, int y) {
  int val = x   y;
  accum  = val;
  return val;
}

int main() {
  return sum(3,2);
}
  

Я пытаюсь скомпилировать его до сборки, используя следующую команду в моем терминале:

 gcc -m32 -O1 -o sum sum.c
  

Вместо ожидаемого sum выходного файла я вижу следующую ошибку:

 ld: warning: The i386 architecture is deprecated for macOS (remove from the Xcode build setting: ARCHS)
ld: warning: ignoring file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/libSystem.tbd, missing required architecture i386 in file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/libSystem.tbd
ld: dynamic main executables must link with libSystem.dylib for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  

Из того, что я могу сказать, компилятор игнорирует файл libSystem.tbd , потому что для этого файла требуется 32-разрядная архитектура, а затем компоновщик впоследствии завершается с ошибкой, потому что этот файл отсутствует в компиляции.

Я бы хотел иметь возможность следовать примерам в тексте, но я не уверен, какие у меня есть варианты, кроме переключения на 32-разрядную машину. Есть идеи?

Комментарии:

1. Ну, просто используйте godbolt

2. Рассмотрите возможность использования Debian и прочитайте документацию GCC . Вы хотите скомпилировать gcc -Wall -Wextra -g . Почему вы не используете 64-битный компилятор? Читайте современный C и черпайте вдохновение из существующего программного обеспечения на github

3. @BasileStarynkevitch текст, который я использую в качестве ссылки, использует 32-разрядную архитектуру в своем примере кода.

4. Если вы просто хотите увидеть язык ассемблера, как насчет gcc -m32 -O1 -S sum.c ? Это скомпилирует исходный код C для вывода сборки sum.s .

5. Лучше использовать gcc -m32 -O2 -S -Wall -fverbose-asm sum.c , предполагая недавний и подлинный компилятор GCC