@@ -77,7 +77,10 @@ def get_linker_script_data(script):
77
77
# script is a whitespace.
78
78
text = " %s" % text
79
79
80
- close_brace = re .compile (r"\s}" )
80
+ # Lex out comments
81
+ text = re .sub (r"/\*.*?\*/" , " " , text )
82
+
83
+ close_brace = re .compile (r"\s}(\s*>\s*\w+)?" )
81
84
memory_cmd = re .compile (r"\sMEMORY\s*{" )
82
85
sections_cmd = re .compile (r"\sSECTIONS\s*{" )
83
86
assign_current = re .compile (r"\s(?P<sym>\w+)\s*=\s*\.\s*;" )
@@ -256,6 +259,7 @@ def close_brace_fun(state, _, buf):
256
259
sym = state ["end-valid" ].group ("sym" )
257
260
info ("'%s' marks the end of section '%s'" , sym , sec )
258
261
state ["sections" ][sec ]["end" ] = sym
262
+ state ["end-valid" ] = None
259
263
else :
260
264
# Linker script assigned end-of-section to a symbol, but not
261
265
# the start. this is useless to us.
@@ -388,7 +392,7 @@ def symbols_from(object_file):
388
392
389
393
def match_up_addresses (script_data , symbol_table ):
390
394
ret = []
391
- for data in script_data ["sections" ].values ():
395
+ for name , data in script_data ["sections" ].items ():
392
396
ok = False
393
397
if "size" in data and "start" in data :
394
398
ok = True
@@ -404,6 +408,7 @@ def match_up_addresses(script_data, symbol_table):
404
408
region ["start" ] = {"sym" : sym , "val" : value }
405
409
if "end" in data and sym == data ["end" ]:
406
410
region ["end" ] = {"sym" : sym , "val" : value }
411
+ region ["section" ] = name
407
412
append = False
408
413
if "size" in region and "start" in region :
409
414
append = True
@@ -424,6 +429,9 @@ def get_region_range(region):
424
429
e_var = region ["end" ]["sym" ]
425
430
ret ["start" ] = start
426
431
ret ["size" ] = size
432
+ ret ["start-symbol" ] = s_var
433
+ ret ["end-symbol" ] = e_var
434
+ ret ["has-end-symbol" ] = True
427
435
ret ["annot" ] = "__CPROVER_allocated_memory(%s, %d);" % (hex (start ), size )
428
436
ret ["commt" ] = "from %s to %s" % (s_var , e_var )
429
437
elif "size" in region :
@@ -433,10 +441,14 @@ def get_region_range(region):
433
441
z_var = region ["size" ]["sym" ]
434
442
ret ["start" ] = start
435
443
ret ["size" ] = size
444
+ ret ["start-symbol" ] = s_var
445
+ ret ["size-symbol" ] = z_var
446
+ ret ["has-end-symbol" ] = False
436
447
ret ["annot" ] = "__CPROVER_allocated_memory(%s, %d);" % (hex (start ), size )
437
448
ret ["commt" ] = "from %s for %s bytes" % (s_var , z_var )
438
449
else :
439
450
raise "Malformatted region\n %s" % str (region )
451
+ ret ["section" ] = region ["section" ]
440
452
return ret
441
453
442
454
@@ -502,9 +514,9 @@ def main():
502
514
503
515
regions = match_up_addresses (script_data , symbol_table )
504
516
505
- info (json .dumps (symbol_table , indent = 2 ))
506
- info (json .dumps (script_data , indent = 2 ))
507
- info (json .dumps (regions , indent = 2 ))
517
+ info ("symbol table %s" % json .dumps (symbol_table , indent = 2 ))
518
+ info ("script data %s" % json .dumps (script_data , indent = 2 ))
519
+ info ("regions %s" % json .dumps (regions , indent = 2 ))
508
520
509
521
final = json .dumps (final_json_output (regions , symbol_table ),
510
522
indent = 2 )
0 commit comments