TCC-DOC(1) Tiny C Compiler TCC-DOC(1)

tcc - کامپایلر کوچک و سریع C

کاربرد: tcc [options] [infile1 infile2...] [-run infile args...]

گزینه‌های TCC شباهت بسیار زیادی به گزینه‌های gcc دارند. تفاوت اصلی در این است که TCC می‌تواند برنامهٔ حاصل را مستقیماً اجرا کرده و آرگومان‌های زمان اجرا را نیز به آن منتقل کند.

در ادامه چند مثال برای درک منطق کارکرد آورده شده است:

"tcc -run a.c"
کامپایل a.c و اجرای مستقیم آن
"tcc -run a.c arg1"
کامپایل a.c و اجرای مستقیم آن. مقدار arg1 به عنوان اولین آرگومان به تابع main() در a.c فرستاده می‌شود.
"tcc a.c -run b.c arg1"
کامپایل a.c و b.c، پیوند زدن آن‌ها با یکدیگر و اجرای برنامه حاصل. مقدار arg1 به عنوان اولین آرگومان به تابع main() برنامهٔ حاصل داده می‌شود.
"tcc -o myprog a.c b.c"
کامپایل a.c و b.c، پیوند زدن آن‌ها و تولید فایل اجرایی myprog.
"tcc -o myprog a.o b.o"
پیوند زدن a.o و b.o با یکدیگر و تولید فایل اجرایی myprog.
"tcc -c a.c"
کامپایل a.c و تولید فایل شیء (object file) a.o.
"tcc -c asmfile.S"
پیش‌پردازش با پیش‌پردازندهٔ C، اسمبل کردن asmfile.S و تولید فایل شیء asmfile.o.
"tcc -c asmfile.s"
اسمبل کردن (بدون پیش‌پردازش) asmfile.s و تولید فایل شیء asmfile.o.
"tcc -r -o ab.o a.c b.c"
کامپایل a.c و b.c، پیوند زدن آن‌ها با یکدیگر و تولید فایل شیء ab.o.

اسکریپت‌نویسی:

از TCC می‌توان درست همانند اسکریپت‌های شل در اسکریپت‌ها استفاده کرد. تنها کافی است "#!/usr/local/bin/tcc -run" را در ابتدای کد منبع C خود اضافه کنید:

#!/usr/local/bin/tcc -run
#include <stdio.h>

int main() 
{
    printf("Hello World\n");
    return 0;
}

TCC می‌تواند در صورت استفاده از - به جای infile، کد منبع C را از ورودی استاندارد بخواند. مثال:

echo 'main(){puts("hello");}' | tcc -run -
تولید یک فایل شیء (object file).
قرار دادن فایل شیء، فایل اجرایی، یا dll در فایل خروجی outfile.
کامپایل فایل source و اجرای آن با آرگومان‌های خط فرمان
args. به منظور امکان ارسال بیش از یک آرگومان به یک
اسکریپت، می‌توان چندین گزینه TCC را پس از گزینه
-run و با فاصله از هم مشخص کرد:
        tcc "-run -L/usr/X11R6/lib -lX11" ex4.c

در یک اسکریپت، سرآیند زیر را ایجاد می‌کند:

#!/usr/local/bin/tcc -run -L/usr/X11R6/lib -lX11
نمایش نسخه TCC.
نمایش فایل‌های گنجانده‌شده (included). در صورت استفاده به عنوان تنها آرگومان، دایرکتوری‌های جستجو را چاپ می‌کند. گزینه -vvv تلاش‌ها را نیز نمایش می‌دهد.
نمایش آمار و اطلاعات کامپایل.

گزینه‌های پیش‌پردازنده:

مشخص کردن یک مسیر include اضافی. مسیرهای include به ترتیبی که مشخص شده‌اند جستجو می‌شوند.

مسیرهای include سیستمی همواره پس از آن‌ها جستجو می‌شوند. مسیرهای پیش‌فرض include سیستم عبارتند از: /usr/local/include، /usr/include و PREFIX/lib/tcc/include. (PREFIX معمولاً /usr یا /usr/local است).

مشخص کردن یک مسیر include سیستمی جهت افزودن به پیش‌فرض‌ها.
مسیرهای پیش‌فرض include سیستم جستجو نشوند؛ تنها مسیرهای include ارائه‌شده در خط فرمان جستجو شوند.
گنجاندن file در ابتدای هر فایل ورودی.
تعریف نماد پیش‌پردازنده sym با مقدار val. اگر val مشخص نشده باشد، مقدار آن 1 خواهد بود. ماکروهای تابع‌گونه را نیز می‌توان تعریف کرد: -DF(a)=a+1
حذف تعریف نماد پیش‌پردازنده sym.
تنها پیش‌پردازش انجام شود، به stdout یا فایل (با -o).
دستورات "#line" در خروجی نوشته نشوند.
نوشتن دستورات جایگزین "#line" در خروجی.
نوشتن دستورات "#define" در خروجی.
مشابه -opt.

پرچم‌های کامپایل:

نکته: هر یک از گزینه‌های زیر دارای یک فرم نقیض است که با -fno- شروع می‌شود.

نوع داده "char" بدون علامت (unsigned) باشد.
نوع داده "char" علامت‌دار (signed) باشد.
عدم تولید نمادهای مشترک (common symbols) برای داده‌های مقداردهی‌نشده.
افزودن یک زیرخط (underscore) به ابتدای هر نماد C.
اجازه استفاده از افزونه‌های کامپایلر MS C به زبان. در حال حاضر فرض می‌شود اعلان یک ساختار تو‌در‌توی دارای نام اما بدون شناسه، مانند یک ساختار بدون نام رفتار می‌کند.
اجازه استفاده از علامت دلار ($) در شناسه‌ها.
ارزیابی آرگومان‌های تابع از راست به چپ.
"extern inline" مانند "static inline" رفتار کند.
ایجاد بخش eh_frame [فعال]
تولید کد پوشش آزمون (code coverage). پس از اجرای کد حاصل، فایلی به نام executable.tcov یا sofile.tcov حاوی پوشش کد تولید می‌شود.

گزینه‌های هشدار:

غیرفعال کردن تمام هشدارها.

نکته: هر یک از گزینه‌های هشدار زیر دارای یک فرم نقیض است که با -Wno- شروع می‌شود.

هشدار در صورت اعلان ضمنی تابع (نبود پیش‌نمونه یا prototype).
هشدار در صورت نادیده گرفته شدن یا حذف const.
هشدار درباره ویژگی‌های پشتیبانی‌نشده GCC که توسط TCC نادیده گرفته می‌شوند.
تنظیم نوع ثوابت رشته‌ای به صورت "const char *" به جای "char *".
توقف کامپایل در صورت صدور هشدار. می‌توان گزینه‌ای برای فعال کردن هشدار مشخص و تبدیل آن به خطا تعیین کرد، به عنوان مثال -Werror=unsupported.
فعال‌سازی برخی هشدارهای کاربردی (-Wimplicit-function-declaration، -Wdiscard-qualifiers).

گزینه‌های پیونددهنده:

مشخص کردن یک مسیر اضافی کتابخانه برای گزینه -l. مسیرهای پیش‌فرض کتابخانه عبارتند از /usr/local/lib، /usr/lib و /lib.
پیوند دادن برنامه با کتابخانه پویای libxxx.so یا کتابخانه ایستای libxxx.a. کتابخانه در مسیرهای مشخص‌شده توسط گزینه -L و متغیر LIBRARY_PATH جستجو می‌شود.
تعیین مسیری که کتابخانه‌های داخلی tcc (و فایل‌های include) در آن یافت می‌شوند (پیش‌فرض PREFIX/lib/tcc است).
تولید یک کتابخانه اشتراکی به جای یک فایل اجرایی.
تنظیم نام کتابخانه اشتراکی برای استفاده در زمان اجرا.
تولید یک فایل اجرایی با پیوند ایستا (پیش‌فرض، فایل اجرایی با پیوند اشتراکی است).
صادر کردن نمادهای سراسری به پیونددهنده پویا. این گزینه زمانی مفید است که یک کتابخانه بازشده با dlopen() نیاز به دسترسی به نمادهای فایل اجرایی داشته باشد.
تولید یک فایل شیء با ترکیب تمام فایل‌های ورودی.
عدم پیوند ضمنی با libc، فایل‌های زمان اجرای C و libtcc1.
عدم جستجو در مسیرهای پیش‌فرض کتابخانه‌ها (/usr/local/lib، /usr/lib و /lib). تنها مسیرهای مشخص‌شده با -L و LIBRARY_PATH جستجو می‌شوند.
قرار دادن مسیر جستجوی سفارشی کتابخانه‌های پویا در فایل اجرایی.
تنظیم مفسر ELF (پیونددهنده پویا). پیش‌فرض آن برابر مقدار متغیر محیطی LD_SO (در صورت تنظیم) یا مقدار پیش‌فرض داخلی است.
هنگام قرار دادن مسیر جستجوی سفارشی کتابخانه‌های پویا در فایل اجرایی، ایجاد تگ پویای جدید ELF یعنی DT_RUNPATH به جای تگ قدیمی DT_RPATH..IP -Wl,--oformat=fmt 4 استفاده از fmt به‌عنوان قالب خروجی. قالب‌های خروجی پشتیبانی‌شده عبارتند از:
"elf32-i386"
قالب خروجی ELF (پیش‌فرض)
"binary"
تصویر باینری (تنها برای خروجی اجرایی)
"coff"
قالب خروجی COFF (تنها برای خروجی اجرایی مقصد TMS320C67xx)
برون‌ریزی نمادهای سراسری به پیونددهندهٔ پویا (dynamic linker). این گزینه زمانی مفید است که یک کتابخانهٔ بازشده با dlopen() نیاز به دسترسی به نمادهای فایل اجرایی داشته باشد.
تنظیم نوع برای فایل‌های اجرایی PE (ویندوز).
تغییر چیدمان (layout) فایل اجرایی.
تنظیم برچسب DT_SYMBOLIC.
فعال/غیرفعال کردن پیوند دادن تمامی آبجکت‌ها در آرشیوها.

گزینه‌های اشکال‌زدا (Debugger):

تولید اطلاعات اشکال‌زدایی زمان اجرای stab تا پیام‌های خطای زمان اجرای واضح‌تری دریافت کنید: " test.c:68: in function 'test5()': dereferencing invalid pointer" به‌جای پیام مختصر و مبهم "Segmentation fault".
تولید اطلاعات اشکال‌زدایی زمان اجرای dwarf به‌جای اطلاعات اشکال‌زدایی stab.
تولید کدهای پشتیبان اضافی برای بررسی تخصیص‌های حافظه و محدوده‌های آرایه/اشاره‌گر. گزینهٔ -g به‌طور ضمنی اعمال می‌شود.
نمایش N فراخواننده در ردگیری پشته (stack trace). این گزینه همراه با -g یا -b مفید است. هنگام فعال بودن، "__TCC_BACKTRACE__" تعریف می‌شود.

در فایل‌های اجرایی، پشتیبانی مضاعف برای ردگیری پشته گنجانده شده است. تابع
" int tcc_backtrace(const char *fmt, ...); " ارائه شده است تا در صورت نیاز بتوان یک ردگیری پشته را به همراه یک پیام راه‌اندازی کرد.

گزینه‌های متفرقه:

تعریف "__STDC_VERSION__": مقدار 201112 اگر version برابر با c11 یا gnu11 باشد؛ در غیر این صورت 199901.
مشخص کردن نوع محتوای فایل ورودی بعدی: به‌ترتیب C، اسمبلی (assembly)، باینری (binary)، یا هیچ‌کدام (none).
مشابه با -D__OPTIMIZE__ به‌جز برای -O0.
پیش‌پردازش با -D_REENTRANT و پیوند با -lpthread.
تنها خروجی دادن قطعه‌کد makefile شامل وابستگی‌ها.
مشابه -M به‌جز اینکه تنها فایل‌های سرآیند کاربر را ذکر می‌کند، نه فایل‌های سرآیند سیستم را.
تولید قطعه‌کد makefile به همراه وابستگی‌ها.
مشابه -MD به‌جز اینکه تنها فایل‌های سرآیند کاربر را ذکر می‌کند، نه فایل‌های سرآیند سیستم را.
استفاده از depfile به‌عنوان خروجی برای -MD.
قید کردن تمامی وابستگی‌ها به‌عنوان هدف (target).
چاپ دایرکتوری نصب پیکربندی‌شده و فهرستی از دایرکتوری‌های کتابخانه و include که tcc در آن‌ها جستجو خواهد کرد.
چاپ نسخه.
همراه با -run/-E: تعریف خودکار ماکروهای 'test_...'

گزینه‌های ویژهٔ معماری مقصد (Target):

استفاده از الگوریتمی برای تراز فیلدهای بیتی (bitfield) که با MSVC سازگار باشد. حالت پیش‌فرض الگوریتم gcc است.
انتخاب ABI ممیز شناور. مقادیر ممکن: "softfp" و "hard"
عدم استفاده از ثبات‌های sse در معماری x86_64.
ارسال خط فرمان به کامپایلر متقاطع (cross compiler) i386/x86_64.

نکته: گزینه‌های GCC شامل -fx و -mx نادیده گرفته می‌شوند..SH "محیط (ENVIRONMENT)" متغیرهای محیطی که بر نحوه کارکرد tcc اثر می‌گذارند.

فهرستی از دایرکتوری‌های جداشده با دونقطه (:) که برای فایل‌های include جستجو می‌شوند؛ دایرکتوری‌هایی که با -I مشخص شده‌اند، ابتدا جستجو می‌شوند.
فهرستی از دایرکتوری‌های جداشده با دونقطه (:) که برای کتابخانه‌های مربوط به گزینهٔ -l جستجو می‌شوند؛ دایرکتوری‌هایی که با -L مشخص شده‌اند، ابتدا جستجو می‌شوند.

cpp(1), gcc(1)

Fabrice Bellard

2026-02-02 0.9.28rc