Control: reassign -1 g++-4.9 4.9.1-16
Control: affects -1 cbmc

> This also occurs with arb:
> https://buildd.debian.org/fetch.cgi?pkg=arb&arch=i386&ver=6.0.2-1&stamp=1412337993&file=log
> 
> > It seems to be a bug in binutils[1].
> 
> I'd say a change in binutils exposed a bug somewhere in the toolchain.
> 
> Here's the commit which added the check and the message:
> 
> https://www.sourceware.org/ml/binutils/2014-09/msg00094.html
> 
> Here's Alan's answer to me asking what I can do to repair this:
> https://www.sourceware.org/ml/binutils/2014-09/msg00175.html
> 

As the recent update to binutils provides a lot more helpful output on this
issue, I've followed Alan's advice. A couple of things appear to be noteworthy.
The failing commands for CBMC are:

cbmc-4.9/src/util# make
ld -r -o util.a arith_tools.o base_type.o cmdline.o config.o symbol_table.o 
expr.o expr_util.o i2string.o irep.o language.o lispexpr.o lispirep.o 
location.o message.o language_file.o mp_arith.o namespace.o parseoptions.o 
rename.o replace_expr.o threeval.o typecheck.o graph.o type.o cnf_simplify.o 
pointer_predicates.o merge_irep.o bitvector.o parser.o map_util.o 
replace_symbol.o actuals.o get_module.o string_hash.o string_container.o 
identifier.o rational.o options.o c_misc.o simplify_expr.o dstring.o 
find_symbols.o rational_tools.o ui_message.o simplify_utils.o time_stopping.o 
symbol.o irep_hash_container.o cout_message.o type_eq.o guard.o array_name.o 
message_stream.o substitute.o decision_procedure.o union_find.o xml.o 
xml_irep.o xml_expr.o std_types.o std_code.o format_constant.o find_macros.o 
ref_expr_set.o std_expr.o irep_serialization.o fixedbv.o rename_symbol.o 
ieee_float.o signal_catcher.o pointer_offset_size.o bv_arithmetic.o tempdir.o 
tempfile.o timer.o unicode.o irep_ids.o byte_operators.o string2int.o 
file_util.o memory_info.o pipe_stream.o irep_hash.o
g++  -o ieee_float_test ieee_float_test.o util.a ../big-int/bigint.o 
../big-int/bigint-func.o
/usr/bin/ld: .eh_frame_hdr table[769] FDE at 00000000080d3738 overlaps 
table[770] FDE at 00000000080d46c4.
[...]
/usr/bin/ld: .eh_frame_hdr table[988] FDE at 00000000080de20c overlaps 
table[989] FDE at 00000000080e3698.
collect2: error: ld returned 1 exit status
Makefile:61: recipe for target 'ieee_float_test' failed
make: *** [ieee_float_test] Error 1


1. Replacing util.a in the call to g++ by its constituting set of object files
makes the build succeed:

cbmc-4.9/src/util# g++  -o ieee_float_test ieee_float_test.o arith_tools.o 
base_type.o cmdline.o config.o symbol_table.o expr.o expr_util.o i2string.o 
irep.o language.o lispexpr.o lispirep.o location.o message.o language_file.o 
mp_arith.o namespace.o parseoptions.o rename.o replace_expr.o threeval.o 
typecheck.o graph.o type.o cnf_simplify.o pointer_predicates.o merge_irep.o 
bitvector.o parser.o map_util.o replace_symbol.o actuals.o get_module.o 
string_hash.o string_container.o identifier.o rational.o options.o c_misc.o 
simplify_expr.o dstring.o find_symbols.o rational_tools.o ui_message.o 
simplify_utils.o time_stopping.o symbol.o irep_hash_container.o cout_message.o 
type_eq.o guard.o array_name.o message_stream.o substitute.o 
decision_procedure.o union_find.o xml.o xml_irep.o xml_expr.o std_types.o 
std_code.o format_constant.o find_macros.o ref_expr_set.o std_expr.o 
irep_serialization.o fixedbv.o rename_symbol.o ieee_float.o signal_catcher.o 
pointer_offset_size.o bv_arithmetic.o tempdir.o tempfile.o timer.o unicode.o 
irep_ids.o byte_operators.o string2int.o file_util.o memory_info.o 
pipe_stream.o irep_hash.o ../big-int/bigint.o ../big-int/bigint-func.o
cbmc-4.9/src/util#

2. (I had tried the above to further simplify debugging when dumping the map
file as suggested by Alan.) So I had to look at two map files built using
-Wl,-Map,... - one for the above g++ call, and one for the earlier ld building
util.a. Adding up the offsets it seems that there are clashes in a number of
object files, but base_type.o is one of them. Here's the result of readelf -wf
base_type.o | grep FDE:

00000018 0000002c 0000001c FDE cie=00000000 pc=00000000..00000035
00000048 0000001c 0000004c FDE cie=00000000 pc=00000035..00000051
00000068 0000001c 0000006c FDE cie=00000000 pc=00000051..0000006d
00000088 0000001c 0000008c FDE cie=00000000 pc=0000006d..00000089
000000a8 0000001c 000000ac FDE cie=00000000 pc=00000089..000000a5
000000c8 0000001c 000000cc FDE cie=00000000 pc=000000a6..000000bf
000000e8 0000001c 000000ec FDE cie=00000000 pc=000000c0..000000d9
00000108 0000001c 0000010c FDE cie=00000000 pc=000000da..000000f6
00000128 0000006c 0000012c FDE cie=00000000 pc=00000000..000000d5
000001b8 00000034 00000024 FDE cie=00000198 pc=00000000..00000091
000001f0 00000030 0000005c FDE cie=00000198 pc=00000000..00000073
00000224 00000050 00000228 FDE cie=00000000 pc=00000000..0000017a
00000278 00000050 0000027c FDE cie=00000000 pc=00000000..000001e8
000002cc 00000034 000002d0 FDE cie=00000000 pc=00000000..00000034
00000304 000000d8 00000308 FDE cie=00000000 pc=00000000..00000258
000003e0 0000003c 000003e4 FDE cie=00000000 pc=00000000..00000045
00000420 0000003c 00000424 FDE cie=00000000 pc=00000000..00000055
00000460 0000003c 00000464 FDE cie=00000000 pc=00000000..00000053
000004a0 00000034 0000030c FDE cie=00000198 pc=00000260..00000387
000004d8 00000070 000004dc FDE cie=00000000 pc=00000000..000000f0
0000054c 00000034 00000550 FDE cie=00000000 pc=00000000..00000034
00000584 00000074 00000588 FDE cie=00000000 pc=00000000..0000017a
000005fc 00000034 00000468 FDE cie=00000198 pc=00000390..00000633
00000634 00000030 000004a0 FDE cie=00000198 pc=00000640..000006bb
00000668 00000080 0000066c FDE cie=00000000 pc=000006c0..000007a6
000006ec 00000070 000006f0 FDE cie=00000000 pc=00000000..00000100
00000760 00000034 000005cc FDE cie=00000198 pc=000007b0..000011ca
00000798 00000034 00000604 FDE cie=00000198 pc=000011d0..000012f7

Just in case, base_type.o is built as follows:

g++ -c -MMD -MP -DSTL_HASH_TR1 -Wall -O2 -I .. -o base_type.o base_type.cpp

My understanding of the output of readelf is limited, but from
https://sourceware.org/bugzilla/show_bug.cgi?id=17447#c3 I gather that the pc=
bits are address ranges that are not supposed to overlap. Yet here there seem to
be multiple (and strange) overlaps: 1) The first five have a 1-byte overlap,
whereas the later ones start at the next byte only. 2) The range
pc=00000000..0000017a exists twice. 3) There are multiple entries starting at
00000000.

Best,
Michael

Attachment: pgp0WkELNCSk4.pgp
Description: PGP signature

Reply via email to