mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 13:09:38 +00:00 
			
		
		
		
	 375f969d43
			
		
	
	375f969d43
	
	
	
		
			
			It is now possible to have any alignment restriction on rodata in the user applicaiton. It will not affect the first section which must be aligned on a 16-byte bound. Closes https://github.com/espressif/esp-idf/issues/6719
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| #
 | |
| # Copyright 2020 Espressif Systems (Shanghai) PTE LTD
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #     http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| #
 | |
| 
 | |
| import argparse
 | |
| import re
 | |
| import subprocess
 | |
| from typing import Tuple
 | |
| 
 | |
| argparser = argparse.ArgumentParser()
 | |
| 
 | |
| argparser.add_argument('readelf')
 | |
| argparser.add_argument('elf')
 | |
| 
 | |
| args = argparser.parse_args()
 | |
| 
 | |
| # Get the content of the readelf command
 | |
| contents = subprocess.check_output([args.readelf, '-S', args.elf]).decode()
 | |
| 
 | |
| 
 | |
| # Define a class for readelf parsing error
 | |
| class ParsingError(Exception):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| # Look for the start address and size of any section
 | |
| def find_partition_info(sectionname):  # type: (str) -> Tuple[int, int, int]
 | |
|     match = re.search(sectionname + r'\s+PROGBITS\s+([a-f0-9]+) [a-f0-9]+ ([a-f0-9]+) \d+\s+[A-Z]+  0   0 (\d+)',
 | |
|                       contents)
 | |
|     if not match:
 | |
|         raise ParsingError('ELF header parsing error')
 | |
|     # Return the address of the section, the size and the alignment
 | |
|     address = match.group(1)
 | |
|     size = match.group(2)
 | |
|     alignment = match.group(3)
 | |
|     return (int(address, 16), int(size, 16), int(alignment, 10))
 | |
| 
 | |
| 
 | |
| # Get address and size for .flash.appdesc section
 | |
| app_address, app_size, app_align = find_partition_info('.flash.appdesc')
 | |
| 
 | |
| # Same goes for .flash.rodata section
 | |
| rodata_address, _, rodata_align = find_partition_info('.flash.rodata')
 | |
| 
 | |
| # Assert than everything is as expected:
 | |
| # appdesc is aligned on 16
 | |
| # rodata is aligned on 64
 | |
| # appdesc ends where rodata starts
 | |
| assert app_align == 16, '.flash.appdesc section should have been aligned on 16!'
 | |
| assert rodata_align == 64, '.flash.rodata section should have been aligned on 64!'
 | |
| assert app_address + app_size == rodata_address, ".flash.appdesc's end address and .flash.rodata's begin start must have no gap in between!"
 |