Як поєднувати два об'єднані файли об'єкта .o у GCC у третій файл .o?
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Якщо у вас є доступ до вихідних файлів, -combine
прапор GCC об'єднає вихідні файли перед компіляцією:
$ gcc -c -combine a.c b.c -o c.o
Однак це працює лише для вихідних файлів, і GCC не приймає .o
файли як вхідні дані для цієї команди.
Зазвичай посилання на .o
файли не працює належним чином, оскільки ви не можете використовувати висновок лінкера як вхід для нього. Результатом є спільна бібліотека, яка не пов’язана статично з отриманим виконуваним файлом.
$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
-combine
можливості. Він існує в gcc 4.1.2 і не існує в gcc 6.3.0 (хтось інший може зрозуміти, коли саме його було видалено).