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
Open
Conversation
…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>
Contributor
There was a problem hiding this comment.
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/objdumpdoğrulaması. agent/topics.mdiç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. |
| - **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. |
| - [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>
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?
Metrikler
Doğrulanmış olgular
🤖 Generated with Claude Code |
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ö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/.bssyerleşimi, VMA/LMA ayrımı,.init_array, heap/stack — derinlemesine anlatmak._posts/2026-05-26-linker-script-anatomisi-arm-bare-metal.mdpost/2026-05-26-linker-script-anatomisi-arm-bare-metalKonu Seçimi ve Gerekçesi
Faz 2 — değerlendirme:
.ldwalkthrough +.map+objdumpAlan rotasyonu doğrulaması:
"Bu Konuyu Bulmak Neden Zor?" (Faz 8 — novelty kapısı)
.lddosyaları satır-satır yorumlanmadan dolaşıma sokuluyor.Boşluk gerçek; yazı doldurmaya çalışıyor.
Derinlik Öğesi (Bölüm 7)
Bellek / assembly incelemesi:
.ldiskeleti satır satır açıklanıyor (MEMORY,SECTIONS,KEEP,AT>,LOADADDR,PROVIDE_HIDDEN,SORT).firmware.mapçıktısından.isr_vector,.text,.data(VMA ≠ LMA!),.bsssatırları dökülüp adresler doğrulanıyor.arm-none-eabi-objdump -hçıktısı tablo halinde gösterilip.datasatırının VMA0x20000000, LMA0x08004fe8olması linker script'in işini doğru yaptığının kanıtı olarak kullanılıyor..datakopyalama döngüsü +.bsssıfırlama +__libc_init_array+main.Bu öğeler "sözde derinlik" değil; her biri kaynaklara karşı doğrulanabilir.
Kullanılan Kaynaklar
Scriptsbölümü__libc_init_arraykaynağı (sourceware)(Yazı sonunda tam liste markdown link olarak verildi.)
Öz-Eleştiri Özeti (Faz 6 — Eleştirmen)
.ld+.map+objdump..init_arrayARM EABI bağlamı, VMA/LMA semantiği web kaynaklarına karşı çapraz kontrol edildi.## Kaynaklarsonu.Öz-Denetim Listesi (Bölüm 13)
layout,title,subtitle,background,date,lang: tr,mermaid: true)YYYY-MM-DD-slug.md; dalpost/YYYY-MM-DD-slugmaster'a hiçbir şey push edilmedi; teslim yalnızca PRagent/topics.mddefteri güncellendiTest planı
bundle exec jekyll buildyerelde temiz mi?_layouts/post.htmlile render doğru mu (mermaid, code blocks, lang attr)?## Kaynaklarbağlantıları gerçekten erişilebilir mi?/img/posts/8.webpmevcut mu? (kontrol edildi — evet)🤖 Generated with Claude Code