Sfoglia il codice sorgente

Merge branch 'bugfix/check_mapping_target_conflict' into 'master'

fix(ldgen): check target conflict for entries with section aliases

Closes IDF-8192

See merge request espressif/esp-idf!25921
Jiang Jiang Jian 2 anni fa
parent
commit
b790f0a773

+ 5 - 4
components/bt/linker.lf

@@ -24,12 +24,13 @@ entries:
 [mapping:bt]
 archive: libbt.a
 entries:
-    * (bt_start_end);
-        bt_bss -> dram0_bss ALIGN(4) ALIGN(4, post) SURROUND(bt_bss),
-        bt_common -> dram0_bss ALIGN(4) ALIGN(4, post) SURROUND(bt_common),
-        data -> dram0_data  ALIGN(4) ALIGN(4, post) SURROUND(bt_data)
     if ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY = y:
         * (extram_bss)
+    else:
+        * (bt_start_end);
+            bt_bss -> dram0_bss ALIGN(4) ALIGN(4, post) SURROUND(bt_bss),
+            bt_common -> dram0_bss ALIGN(4) ALIGN(4, post) SURROUND(bt_common),
+            data -> dram0_data  ALIGN(4) ALIGN(4, post) SURROUND(bt_data)
 
 [mapping:btdm]
 archive: libbtdm_app.a

+ 1 - 1
tools/ldgen/ldgen/generation.py

@@ -471,7 +471,7 @@ class Generation:
 
                         sections_str = get_section_strs(section)
 
-                        key = (entity, section.name)
+                        key = (entity, sections_str)
 
                         try:
                             existing = entity_mappings[key]

+ 33 - 5
tools/ldgen/test/test_generation.py

@@ -70,7 +70,10 @@ class GenerationTest(unittest.TestCase):
             self.entities.add_sections_info(objdump)
 
         with open('data/linker_script.ld') as linker_script:
-            self.linker_script = LinkerScript(linker_script)
+            self.linker_script_expect = LinkerScript(linker_script)
+
+        with open('data/linker_script.ld') as linker_script:
+            self.linker_script_actual = LinkerScript(linker_script)
 
     @staticmethod
     def create_fragment_file(contents, name='test_fragment.lf'):
@@ -84,11 +87,11 @@ class GenerationTest(unittest.TestCase):
         self.generation.add_fragments_from_file(fragment_file)
 
     def write(self, expected, actual):
-        self.linker_script.fill(expected)
-        self.linker_script.write(open('expected.ld', 'w'))
+        self.linker_script_expect.fill(expected)
+        self.linker_script_expect.write(open('expected.ld', 'w'))
 
-        self.linker_script.fill(actual)
-        self.linker_script.write(open('actual.ld', 'w'))
+        self.linker_script_actual.fill(actual)
+        self.linker_script_actual.write(open('actual.ld', 'w'))
 
     def generate_default_rules(self):
         rules = collections.defaultdict(list)
@@ -782,6 +785,31 @@ entries:
         with self.assertRaises(GenerationException):
             self.generation.generate(self.entities)
 
+    def test_same_entity_conflicting_section(self):
+        # Test same entity being mapped by scheme conflicting with another.
+        #
+        # custom_rtc = .text -> rtc_text
+        # noflash = .text -> iram0_text, .rodata -> dram0_data
+        #
+        # This operation should fail.
+        mapping = u"""
+[sections:custom_text]
+entries:
+    .text+
+    .literal+
+
+[scheme:custom_rtc]
+entries:
+    custom_text -> rtc_text
+
+[mapping:test]
+archive: libfreertos.a
+entries:
+    croutine (noflash)                              #1
+    croutine (custom_rtc)                           #2
+"""
+        self.test_same_entity_conflicting_scheme(mapping)
+
     def test_complex_mapping_case(self, alt=None):
         # Test a complex case where an object is mapped using
         # one scheme, but a specific symbol in that object is mapped