From 4736da09ece311072495a145a0ea7175c79452fb Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Sun, 30 Jul 2023 15:12:16 +0300 Subject: [PATCH] tcc static build --- .../2023/c/tcc-build-static-executable.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 content/posts/2023/c/tcc-build-static-executable.md diff --git a/content/posts/2023/c/tcc-build-static-executable.md b/content/posts/2023/c/tcc-build-static-executable.md new file mode 100644 index 0000000..71ffdec --- /dev/null +++ b/content/posts/2023/c/tcc-build-static-executable.md @@ -0,0 +1,88 @@ +--- +title: "πŸͺ΅ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ cтатичСских Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ TinyCC" +date: 2023-07-30T13:52:57+03:00 +draft: false +tags: [c, tips] +--- + +## Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ + +ΠΠ΅Ρ€ΡƒΡˆΠΈΠΌΠΎΠΉ истинной являСтся Ρ„Π°ΠΊΡ‚, +Ρ‡Ρ‚ΠΎ для cтатичСской компиляции компилятору Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ `-static` +ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `-l`, +список ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… отличаСтся ΠΎΡ‚ динамичСской компиляции. + +Однако для **tcc** это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. + +## ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ cтатичСских исполныСмых Ρ„Π°ΠΉΠ»ΠΎΠ² + +На ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ **SQLite3** ΠΏΠΎΠΊΠ°ΠΆΡƒ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. + +Для получСния списка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ инструмСнтом **pkg-config**. + +```text +$ pkg-config --libs sqlite3 +-lsqlite3 +``` + +Для статичСской компиляции список Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС. + +```text +$ pkg-config --libs --static sqlite3 +-lsqlite3 -lm -lz +``` + +Π’ ΠΈΡ‚ΠΎΠ³Π΅ получаСтся, Ρ‡Ρ‚ΠΎ для GCC/Clang ΠΊΠΎΠΌΠ°Π½Π΄Π° компиляции Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. + +```sh +gcc -static -Wall -O3 -o ${file%.*} $file `pkg-config --libs --static sqlite3` +``` + +МнС казалось ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ для TCC Π΄Π΅Π»Π° обстоят Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, +ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ Ρ‚ΡƒΡ‚ Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ. + +## -static Π² TCC + +На страницы Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ **TCC** (https://bellard.org/tcc/tcc-doc.html) +ΡƒΠΊΠ°Π·Π°Π½Π° опция `-static`. + +Π¦ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ: + +```text +-static + Generate a statically linked executable (default is a shared linked executable). +``` + +Запустив `tcc` с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ `-hh`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΡƒΡŽ справку, +ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² описании ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ `-static` +написано **Π½Π΅ рСкомСндуСтся ΠΊ использованию**. + +Π¦ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· справки: + +```text +-static link to static libraries (not recommended) +``` + +Π’ ΠΌΠΎΡ‘ΠΌ случаС ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Π°ΠΌΠΌΡ‹ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ `-static` компилятор Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ +ΠΎΡˆΠΈΠ±ΠΊΡƒ сСгмСнтации. + +## БтатичСская компилция Π² TCC + +Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² **tcc** ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ статичСски, +Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ компилятору `*.a` Ρ„Π°ΠΉΠ»Ρ‹. + +```sh +tcc -Wall -O3 -o ${file%.*} -I$C_INCLUDE_PATH $file $LIBRARY_PATH/libname.a +``` + +## Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ + +Π₯ΠΎΡ‡Ρƒ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ **tcc** Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния +`C_INCLUDE_PATH` ΠΈΠ»ΠΈ `CPATH` ΠΈ `LIBRARY_PATH`, +с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΠΈ для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. + +Для **tcc** Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ стандартным способом, Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ `-I` ΠΈ `-L`. + +## РСсурсы +* [Re: [Tinycc-devel] Is static linking functional?](https://mail.gnu.org/archive/html/tinycc-devel/2014-06/msg00028.html) +* [Tiny C Compiler Reference Documentation](https://bellard.org/tcc/tcc-doc.html)