Skip to content

Yeni yazı: Linker Script Anatomisi — ARM Bare-Metal için Bir .ld Dosyası Satır Satır#90

Open
Mavrikant wants to merge 2 commits into
masterfrom
post/2026-05-26-linker-script-anatomisi-arm-bare-metal
Open

Yeni yazı: Linker Script Anatomisi — ARM Bare-Metal için Bir .ld Dosyası Satır Satır#90
Mavrikant wants to merge 2 commits into
masterfrom
post/2026-05-26-linker-script-anatomisi-arm-bare-metal

Conversation

@Mavrikant

Copy link
Copy Markdown
Owner

Özet

Bare-metal ARM Cortex-M4 (STM32F4) için gerçek bir linker script (.ld) iskeletini satır satır açıklayan, ~3000 kelimelik teknik yazı. Hedef: main()'e ulaşmadan önce çalışan bağlama zincirini — vector table, .text/.rodata/.data/.bss yerleşimi, VMA/LMA ayrımı, .init_array, heap/stack — derinlemesine anlatmak.

  • 📄 Dosya: _posts/2026-05-26-linker-script-anatomisi-arm-bare-metal.md
  • 🌿 Dal: post/2026-05-26-linker-script-anatomisi-arm-bare-metal
  • 📝 Kelime: ~3,012 | Bölüm: 9 H2 | Mermaid: 1 (bellek haritası)
  • 🎯 Alan: toolchain / build (son 3 yayın ve tüm açık PR alt-alanlarından farklı)

Konu Seçimi ve Gerekçesi

Faz 2 — değerlendirme:

Kriter Durum
İlgili (konu evreni + yazar uzmanlığı) ✔ ARM bare-metal, gömülü sistemler
İlgi çekici (kanca) ✔ "Bilinmeyen kutu" — herkes kullanır, çoğu mühendis anlamaz
Daha önce işlenmemiş ✔ Mevcut yazılar veya açık PR'larda yok
Değerli ✔ Somut .ld walkthrough + .map + objdump
Kalıcı ✔ GNU LD dili 30+ yıllık, ELF ABI sabit
Gizlilik-güvenli ✔ Tamamen kamuya açık (GNU LD, CMSIS, newlib)

Alan rotasyonu doğrulaması:

"Bu Konuyu Bulmak Neden Zor?" (Faz 8 — novelty kapısı)

  • GNU LD manual referans-kılavuz tarzı, İngilizce ve örnek odaklı değil.
  • ARM Cortex-M startup akışı + ELF formatı + VMA/LMA ayrımı + linker dili — dört disiplinin kesişiminde Türkçe sentez nadir.
  • CMSIS şablon .ld dosyaları satır-satır yorumlanmadan dolaşıma sokuluyor.
  • Embedded Artistry, Interrupt by Memfault, Stargirl Flowers gibi mükemmel İngilizce kaynaklar var; Türkçe içerikte bu derinlik yok.

Boşluk gerçek; yazı doldurmaya çalışıyor.

Derinlik Öğesi (Bölüm 7)

Bellek / assembly incelemesi:

  1. Gerçek bir Cortex-M4 .ld iskeleti satır satır açıklanıyor (MEMORY, SECTIONS, KEEP, AT>, LOADADDR, PROVIDE_HIDDEN, SORT).
  2. Tipik bir firmware.map çıktısından .isr_vector, .text, .data (VMA ≠ LMA!), .bss satırları dökülüp adresler doğrulanıyor.
  3. arm-none-eabi-objdump -h çıktısı tablo halinde gösterilip .data satırının VMA 0x20000000, LMA 0x08004fe8 olması linker script'in işini doğru yaptığının kanıtı olarak kullanılıyor.
  4. Vector table[0] = MSP, vector table[1] = Reset_Handler doğrulaması; VTOR mekaniği.
  5. Startup C kodu örneği: .data kopyalama döngüsü + .bss sıfırlama + __libc_init_array + main.

Bu öğeler "sözde derinlik" değil; her biri kaynaklara karşı doğrulanabilir.

Kullanılan Kaynaklar

  • GNU LD (binutils) manuel — Scripts bölümü
  • System V Generic ABI (ELF)
  • ARM Cortex-M4 Generic User Guide (DUI 0553)
  • ARMv7-M Architecture Reference Manual (DDI 0403)
  • Newlib __libc_init_array kaynağı (sourceware)
  • Embedded Artistry — "Exploring Startup Implementations: Newlib (ARM)"
  • Interrupt by Memfault — "From Zero to main(): Demystifying Firmware Linker Scripts"
  • Stargirl (Thea) Flowers — "The Most Thoroughly Commented Linker Script"
  • ARM EABI (IHI 0043)
  • CMSIS-Core (M) Reference

(Yazı sonunda tam liste markdown link olarak verildi.)

Öz-Eleştiri Özeti (Faz 6 — Eleştirmen)

  • ✔ Derinlik gerçek mi? Evet — gerçek .ld + .map + objdump.
  • ✔ Her olgu doğrulanabilir mi? Evet — vector table semantiği, VTOR davranışı, .init_array ARM EABI bağlamı, VMA/LMA semantiği web kaynaklarına karşı çapraz kontrol edildi.
  • ✔ Tek kaynağın yeniden ifadesi mi? Hayır — birden çok ana kaynaktan sentez.
  • ✔ Klişe / SEO yemi var mı? Hayır — sahadan ton, somut detay.
  • ✔ Gizlilik ihlali? Hayır — tamamen kamuya açık standart bilgi; yazarın iç projelerinden hiçbir detay yok.
  • ✔ Üslup mevcut yazılarla tutarlı mı? Evet — birinci tekil/siz hitabı karışık, didaktik-sahadan ton, mermaid + kod blokları + tablo + ## Kaynaklar sonu.

Öz-Denetim Listesi (Bölüm 13)

  • Konu hiçbir yazıyla başlık veya anlam olarak çakışmıyor
  • Altı seçim kriterinin tamamı sağlanıyor; son 3 yazıdan farklı alt-alan
  • "Bu konuyu bulmak neden zor" yanıtlandı
  • En az bir somut derinlik öğesi (bellek/assembly incelemesi)
  • Olgusal iddialar doğrulanabilir
  • Kaynaklar gerçek, erişilebilir
  • Gizli/proprietary/ihracat-kontrollü bilgi yok
  • Front matter şeması mevcut yazılarla aynı (layout, title, subtitle, background, date, lang: tr, mermaid: true)
  • Türkçe gövde + İngilizce alt-başlık; ton "sahadan"
  • Anti-pattern yok
  • Dosya adı YYYY-MM-DD-slug.md; dal post/YYYY-MM-DD-slug
  • master'a hiçbir şey push edilmedi; teslim yalnızca PR
  • agent/topics.md defteri güncellendi

Test planı

  • CI yeşil mi (build-jekyll workflow)?
  • bundle exec jekyll build yerelde temiz mi?
  • Yayında _layouts/post.html ile render doğru mu (mermaid, code blocks, lang attr)?
  • ## Kaynaklar bağlantıları gerçekten erişilebilir mi?
  • /img/posts/8.webp mevcut mu? (kontrol edildi — evet)

🤖 Generated with Claude Code

…ası Satır Satır

Alan: toolchain/build. Cortex-M4 STM32F4 için gerçek bir .ld iskeletini satır
satır açıyor; .map ve objdump çıktılarıyla VMA/LMA, .data kopyalama, .bss
sıfırlama, .init_array ve vector table mekaniklerini doğruluyor.

Derinlik öğesi (Bölüm 7): gerçek .ld + .map + objdump dökümü — bellek/assembly
incelemesi. ~3000 kelime, 9 ana bölüm, Mermaid bellek haritası diyagramı.

agent/topics.md güncellendi: yazılanlara bandpass-sampling, açık PR'lara #88
WCET ve #89 watchdog eklendi; fikir havuzundan linker-script ve bu çalıştırmada
açılan PR'larla çakışan adaylar (MC/DC, CRC, WCET, watchdog) çıkarıldı.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 26, 2026 05:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Bu PR, ARM Cortex-M4 (STM32F4) bare-metal projelerde linker script (.ld) yapısını satır satır anlatan yeni bir blog yazısı ekliyor ve agent/topics.md konu defterini buna göre güncelliyor.

Changes:

  • Yeni yazı eklendi: linker script’te MEMORY/SECTIONS, VMA/LMA, .init_array, heap/stack ve .map/objdump doğrulaması.
  • agent/topics.md içerisine son yayınlanan yazı ve açık PR listesi güncellemeleri eklendi; “seçildi/devam” kısmı linker-script yazısına taşındı.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 7 comments.

File Description
agent/topics.md Konu defteri güncellemesi (yayın listesi, açık PR tablosu, bu çalıştırma notları).
_posts/2026-05-26-linker-script-anatomisi-arm-bare-metal.md Yeni teknik blog yazısı (Mermaid diyagram + linker script walkthrough + map/objdump örnekleri).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

mermaid: true
---

Bare-metal bir ARM Cortex-M projesinde derleme zincirini takip ettiğinizde, kodun `main()`'e ulaşmadan önce geçtiği üç temel adım vardır: derleyici, derleyici (assembler) ve **linker**. İlk ikisi okul müfredatında genellikle kabaca anlatılır; üçüncüsü, yani linker ve onu yönlendiren `.ld` dosyası, çoğu mühendis için bir kutsal metindir — değiştirilmez, anlaşılmaz, "STM32CubeMX zaten üretiyor" denilip geçilir.
Comment on lines +122 to +127
```ld
.text :
{
*(.text*)
*(.rodata*)
*(.glue_7) *(.glue_7t)

`.bss`, başlangıç değeri sıfır olan veya hiç başlatılmamış global / static değişkenleri tutar. ELF'te bu bölüm `NOBITS` tipindedir: load image'de **yer tutmaz**, sadece linker `_sbss`–`_ebss` boyutunu kaydeder. Startup kodu bu aralığı sıfırlar. Bu yüzden FLASH boyutu hesabına `.bss` girmez; ama RAM boyutu hesabına girer.

`*(COMMON)` deyimi, eski K&R C ve bazı yabancı derleyicilerin `extern` tanımlamadan global değişken bildirimi yapmasından miras kalan bir konvansiyondur. Modern projede neredeyse hiç doluymaz; ama linker script'lerde alışkanlık olarak yer alır.
Comment thread agent/topics.md Outdated
- **Linker Script Anatomisi: ARM Bare-Metal için Bir `.ld` Dosyası Satır Satır** —
dal: `post/2026-05-26-linker-script-anatomisi-arm-bare-metal`,
dosya: `_posts/2026-05-26-linker-script-anatomisi-arm-bare-metal.md`,
durum: PR açılacak (bu çalıştırma) — alan: toolchain/build.
Comment thread agent/topics.md
- [x] Ölçüm Belirsizliği (GUM Annex F + NCSLI RP-12) — 2026-05-06 — alan: metroloji
- [x] Kalibrasyon Zincirinin Tepesi (Birincil Standartlar) — 2026-05-07 — alan: metroloji
- [x] Renode ile Zynq7000 Simülasyonu — 2026-05-14 — alan: gömülü/SoC
- [x] Bandpass Sampling: 1 GHz Sinyali 50 MHz Saatle Örneklemek — 2026-05-21 — alan: RF/DSP
Comment on lines +315 to +319
0x000000000800482a _etext = .

.data 0x0000000020000000 0x4c load address 0x0000000008004830
0x0000000020000000 _sdata = .
*(.data*)
Comment on lines +349 to +353
1 .text 00004aa0 08000190 08000190 00010190 2**3
2 .rodata 000003a8 08004c30 08004c30 00014c30 2**3
3 .ARM 00000008 08004fd8 08004fd8 00014fd8 2**2
4 .init_array 00000004 08004fe0 08004fe0 00014fe0 2**2
5 .fini_array 00000004 08004fe4 08004fe4 00014fe4 2**2
İnsan geri bildirimi üzerine yazı tamamen Zynq-7000 (Cortex-A9 + OCM + DDR3
+ QSPI) referansıyla yeniden yazıldı; STM32F4/Cortex-M4 örneklerinin yerini
Renode yazısının doğal devamı olacak şekilde Zynq mimarisi aldı.

Değişiklikler:
- Bellek modeli: FLASH/SRAM/CCM yerine DDR3/OCM/QSPI. OCM_CFG remap
  mekaniği (BootROM 0x18 vs U-Boot 0x1F) açıklandı.
- MEMORY bloğu: ps7_ddr_0, ps7_ocm_low_0, ps7_ocm_high_0, ps7_qspi_linear.
- Vector table: Cortex-A9 8-entry instruction (LDR pc, =Handler), VBAR
  register (CP15 c12 c0 0), VINITHI semantiği.
- VMA/LMA: .ocm_data örneği — OCM'de VMA, DDR'da LMA, LOADADDR() ile
  startup kopyalama.
- Stack/heap: AAPCS 16-byte hizalama, Cortex-A9'un her CPU modu için
  ayrı SP kurulumu (SVC/IRQ/FIQ/Abort/Undef/System).
- Pitfall'lar: OCM remap yanılgısı, çift çekirdek DDR bölme (AMP), MMU
  guard sayfa ile stack overflow yakalama.
- Map/objdump çıktıları: Zynq adres haritasına göre güncellendi.
- Kaynaklar: UG585, Cortex-A9 TRM (DDI 0388), ARMv7-A ARM (DDI 0406),
  CMSIS-Core (A) VBAR, Xilinx embeddedsw lscript.ld eklendi.

Yazı 3000 → 3839 kelime; 9 H2 bölüm; Mermaid bellek haritası Zynq
QSPI/OCM/DDR akışına uyarlandı.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Mavrikant

Copy link
Copy Markdown
Owner Author

Güncelleme — Zynq-7000 referansıyla yeniden yazıldı

İnsan geri bildirimi üzerine yazı tamamen Zynq-7000 mimarisine uyarlandı; CCM yerine OCM anlatılıyor. Bir önceki yazının (Renode ile Zynq7000 Simülasyonu) doğal devamı olacak şekilde aynı SoC üzerinden ilerliyor.

Ne değişti?

  • Bellek modeli: FLASH / SRAM / CCM → DDR3 / OCM / QSPI. slcr.OCM_CFG[RAM_HI] ile 4 bankın düşük (0x0000_0000) veya yüksek (0xFFFC_0000) aralığa eşlenmesi; BootROM 0x18 vs U-Boot 0x1F ayrımı açıklandı.
  • MEMORY bloğu: Zynq-7000 standalone BSP isimlendirmesiyle güncellendi — ps7_ddr_0, ps7_ocm_low_0, ps7_ocm_high_0, ps7_qspi_linear.
  • Vector table: Cortex-M VTOR + 32-bit pointer'lı tablo → Cortex-A9 VBAR + 8 entry instruction tablosu (LDR pc, =Handler). VINITHI semantiği (0x0000_0000 vs 0xFFFF_0000).
  • VMA/LMA: tipik DDR-only senaryoda VMA=LMA olduğu vurgulandı; VMA ≠ LMA örneği olarak .ocm_data kullanıldı (DDR'da LMA, OCM high'da VMA, LOADADDR() ile startup kopyalama). Bootloader senaryosunda QSPI LMA varyantı eklendi.
  • Stack/heap: AAPCS gereği 16 byte hizalama, Cortex-A9'un her CPU modu için ayrı SP kurulumu (SVC/IRQ/FIQ/Abort/Undef/System) örneği eklendi.
  • Pitfall'lar: OCM remap yanılgısı (VBAR güncellenmeden OCM_CFG değişimi), çift çekirdek DDR bölme (AMP), MMU guard sayfa ile stack overflow yakalama (Cortex-A9'da donanım stack-limit register'ı yok).
  • Map ve objdump çıktıları: Zynq adres haritasına göre yeniden üretildi — .vectors 0x0000_0000'da, .text 0x0010_0000'dan, .ocm_data VMA 0xFFFF_0000 / LMA 0x0010_C000.
  • Kaynaklar: UG585 (Zynq-7000 TRM, OCM bölümü), Cortex-A9 TRM (DDI 0388), ARMv7-A ARM (DDI 0406), CMSIS-Core (A) VBAR, Xilinx embeddedsw lscript.ld, Vitis linker script dokümantasyonu eklendi.

Metrikler

  • Kelime: ~3,000 → ~3,839
  • H2 bölüm sayısı: 9 (aynı)
  • Mermaid diyagramı: QSPI → OCM (FSBL) → DDR akışını gösteren boot zinciri görselleştirildi

Doğrulanmış olgular

  • Zynq-7000 OCM = 256 KB, 4×64 KB bank (UG585, On-Chip Memory bölümü)
  • BootROM OCM_CFG = 0x18 (192 KB düşük + 64 KB yüksek)
  • Cortex-A9 VBAR, CP15 c12 c0 0 üzerinden erişilir; VINITHI ile reset değeri 0x0 veya 0xFFFF_0000
  • Cortex-A9 vector table 8 entry × 4 byte instruction
  • AAPCS public arayüz SP hizalaması 8 byte zorunlu, NEON/kütüphaneler için 16 byte pratik standart

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants