libabigail/tests/data/test-read-dwarf/test1.abi
Dodji Seketeli 721728e7de Support reading and comparing soname from ELF files
Libabigail's DWARF reader doesn't read the DT_SONAME tag from the
.dynamic section.  The abigail::corpus type doesn't have a property
for that tag either.  And the comparison engine doesn't take that tag
in when comparing corpora.

This patch modifies the DWARF reader to read the DT_SONAME and
DT_NEEDED tags from the .dynamic section.  The value of DT_SONAME tag
is then saved in the new corpus property accessed by the new
abigail::corpus::get_soname() accessor.  The comparison engine has
also been modified to compare the sonames of two corpora being
compared.  Note that the value of the DT_NEEDED elf tag is saved in a
new corpus property that is accessed via the new
abigail::corpus::get_needed() getter.  This property is not used yet.

This patch also adds a unit test for this new feature.

	* include/abg-corpus.h (corpus::{get_needed, set_needed,
	get_soname, set_soname}): Declare new accessors.
	* src/abg-corpus.cc (corpus::priv::{needed, soname}): New data
	members.
	(corpus::{get_needed, set_needed, get_soname, set_soname}): Define
	new accessors.
	(corpus::is_empty): Take dt_needed and dt_soname in account in
	computing empty-ness.
	* src/abg-dwarf-reader.cc (read_context::{dt_needed_,
	dt_soname_}): New data members.
	(read_context::{dt_needed, dt_soname}): New accessors.
	(read_context::load_dt_soname_and_needed): New member function.
	(read_corpus_from_elf): Call the new
	read_context::load_dt_soname_and_needed() to read the dt_soname
	and dt_needed tags.  Set them to the corpus.
	* include/abg-comparison.h (diff_context::show_soname_change):
	Declare new accessors.
	* src/abg-comparison.cc (diff_context::priv::show_soname_change_):
	New data member.
	(diff_context::priv::priv): Initialize the new data member
	diff_context::priv::show_soname_change_.
	(diff_context::show_soname_change): Define new accessors.
	(corpus_diff::priv::sonames_equal_): New data member.
	(corpus_diff::priv::priv): Initialize the new data member
	corpus_diff::priv::sonames_equal_.
	(corpus_diff::length): Take the new priv_->sonames_equals_ data
	member in account.
	(corpus_diff::{report, priv::emit_diff_stats}): If the sonames
	changed and we are allowed to report it, then report it.
	(compute_diff): In the variant for corpus_diff, do not forget to
	compare the sonames.
	* src/abg-reader.cc (build_needed, read_elf_needed_from_input):
	Define new static functions.
	(read_corpus_from_input): Read the 'soname' attribute from the
	'abi-corpus' xml element node.
	* src/abg-writer.cc (write_elf_needed): Define new static
	function.
	(write_corpus_to_native_xml): Write a new 'elf-needed' xml element
	node that contains one xml 'dependency' element node per
	dependency to emit.  This uses the new write_elf_needed() function
	above.
	* tests/data/test-diff-dwarf/libtest19-soname-v0.so: New test
	input data.
	* tests/data/test-diff-dwarf/libtest19-soname-v1.so: Likewise.
	* tests/data/test-diff-dwarf/test19-soname-report-0.txt: Likewise.
	* tests/data/test-diff-dwarf/test19-soname-v0.c: Source code of
	the first binary above.
	* tests/data/test-diff-dwarf/test19-soname-v1.c: Source code of
	the second binary above.
	* tests/test-diff-dwarf.cc (in_out_specs): Add the test input
	above to the list of test input to run this harness on.
	* tests/data/Makefile.am: Add the new test input data above.
	* tests/data/test-read-dwarf/test{0,1}.abi: Adjust.
	* tests/data/test-read-dwarf/test{2,3,4,6,}.so.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-12-07 23:42:26 +01:00

117 lines
9.5 KiB
Plaintext

<abi-corpus path='data/test-read-dwarf/test1'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
</elf-needed>
<elf-function-symbols>
<elf-symbol name='_Z3fooR2s0' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='_ZN2b0C1Ev' type='func-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZN2b0C2Ev' type='func-type' binding='weak-binding' alias='_ZN2b0C1Ev' is-defined='yes'/>
<elf-symbol name='_ZN2b1C1Ev' type='func-type' binding='weak-binding' alias='_ZN2b1C2Ev' is-defined='yes'/>
<elf-symbol name='_ZN2b1C2Ev' type='func-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZN2s07mem_funEv' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='_ZN2s0C1Ev' type='func-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZN2s0D1Ev' type='func-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='__libc_csu_fini' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='__libc_csu_init' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='_start' type='func-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='main' type='func-type' binding='global-binding' is-defined='yes'/>
</elf-function-symbols>
<elf-variable-symbols>
<elf-symbol name='_IO_stdin_used' type='object-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='_ZTI2b0' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTI2b1' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTI2s0' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTS2b0' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTS2b1' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTS2s0' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTT2s0' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTV2s0' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='_ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3' type='object-type' binding='weak-binding' is-defined='yes'/>
<elf-symbol name='__TMC_END__' type='object-type' binding='global-binding' is-defined='yes'/>
<elf-symbol name='__dso_handle' type='object-type' binding='global-binding' is-defined='yes'/>
</elf-variable-symbols>
<abi-instr version='1.0' address-size='64' path='test1.cc'>
<class-decl name='b0' size-in-bits='128' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='1' column='1' id='type-id-1'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='m0' type-id='type-id-2' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='3' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='64'>
<var-decl name='m1' type-id='type-id-3' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='4' column='1'/>
</data-member>
</class-decl>
<type-decl name='long long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
<type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-3'/>
<class-decl name='b1' size-in-bits='128' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='7' column='1' id='type-id-4'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='m0' type-id='type-id-5' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='9' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='64'>
<var-decl name='m1' type-id='type-id-3' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='10' column='1'/>
</data-member>
</class-decl>
<type-decl name='double' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
<class-decl name='s0' size-in-bits='384' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='13' column='1' id='type-id-6'>
<base-class access='public' layout-offset-in-bits='24' is-virtual='yes' type-id='type-id-1'/>
<base-class access='public' layout-offset-in-bits='32' is-virtual='yes' type-id='type-id-4'/>
<member-type access='public'>
<typedef-decl name='integer' type-id='type-id-8' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='15' column='1' id='type-id-7'/>
</member-type>
<member-type access='public'>
<typedef-decl name='byte' type-id='type-id-10' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='16' column='1' id='type-id-9'/>
</member-type>
<data-member access='public' layout-offset-in-bits='64'>
<var-decl name='m0' type-id='type-id-7' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='18' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='96'>
<var-decl name='m1' type-id='type-id-9' visibility='default' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='19' column='1'/>
</data-member>
<member-function access='public' constructor='yes'>
<function-decl name='s0' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64'>
<parameter type-id='type-id-11' is-artificial='yes'/>
<parameter type-id='type-id-8' is-artificial='yes'/>
</function-decl>
</member-function>
<member-function access='public' destructor='yes'>
<function-decl name='~s0' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='27' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64'>
<parameter type-id='type-id-11' is-artificial='yes'/>
<parameter type-id='type-id-8' is-artificial='yes'/>
</function-decl>
</member-function>
<member-function access='public'>
<function-decl name='mem_fun' mangled-name='_ZN2s07mem_funEv' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='36' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64' elf-symbol-id='_ZN2s07mem_funEv'>
<parameter type-id='type-id-11' is-artificial='yes'/>
<return type-id='type-id-7'/>
</function-decl>
</member-function>
<member-function access='public' constructor='yes'>
<function-decl name='s0' mangled-name='_ZN2s0C1Ev' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64' elf-symbol-id='_ZN2s0C1Ev'>
<parameter type-id='type-id-11' is-artificial='yes'/>
<parameter type-id='type-id-8' is-artificial='yes'/>
</function-decl>
</member-function>
<member-function access='public' destructor='yes'>
<function-decl name='~s0' mangled-name='_ZN2s0D1Ev' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='27' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64' elf-symbol-id='_ZN2s0D1Ev'>
<parameter type-id='type-id-11' is-artificial='yes'/>
<parameter type-id='type-id-8' is-artificial='yes'/>
</function-decl>
</member-function>
</class-decl>
<type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-8'/>
<type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='type-id-10'/>
<pointer-type-def type-id='type-id-6' size-in-bits='64' alignment-in-bits='64' id='type-id-11'/>
<reference-type-def kind='lvalue' type-id='type-id-6' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
<function-decl name='foo' mangled-name='_Z3fooR2s0' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='42' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64' elf-symbol-id='_Z3fooR2s0'>
<parameter type-id='type-id-12' name='s' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='42' column='1'/>
</function-decl>
<function-decl name='main' mangled-name='main' filepath='/home/dodji/git/libabigail/dwarf/tests/data/test-read-dwarf/test1.cc' line='48' column='1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='64' elf-symbol-id='main'>
<return type-id='type-id-8'/>
</function-decl>
</abi-instr>
</abi-corpus>