@@ -152,6 +152,12 @@ public:
bool
operator==(const corpus&) const;
+ void
+ set_symtab(symtab_reader::symtab_sptr);
+
+ const symtab_reader::symtab_sptr&
+ get_symtab() const;
+
void
set_fun_symbol_map(string_elf_symbols_map_sptr);
@@ -1375,6 +1375,14 @@ typedef vector<suppression_sptr> suppressions_type;
} // end namespace suppr
+namespace symtab_reader
+{
+
+class symtab;
+typedef std::shared_ptr<symtab> symtab_sptr;
+
+} // end namespace symtab_reader
+
void
dump(const decl_base_sptr, std::ostream&);
@@ -17,6 +17,7 @@
#include "abg-internal.h"
#include "abg-regex.h"
#include "abg-sptr-utils.h"
+#include "abg-symtab-reader.h"
namespace abigail
{
@@ -684,6 +685,7 @@ struct corpus::priv
string_elf_symbols_map_sptr undefined_var_symbol_map;
elf_symbols sorted_var_symbols;
elf_symbols sorted_undefined_var_symbols;
+ symtab_reader::symtab_sptr symtab_;
string_elf_symbols_map_sptr fun_symbol_map;
string_elf_symbols_map_sptr undefined_fun_symbol_map;
elf_symbols sorted_fun_symbols;
@@ -23,6 +23,7 @@ ABG_BEGIN_EXPORT_DECLARATIONS
#include "abg-ir.h"
#include "abg-reader.h"
#include "abg-sptr-utils.h"
+#include "abg-symtab-reader.h"
#include "abg-tools-utils.h"
#include "abg-writer.h"
@@ -850,6 +851,14 @@ corpus::operator==(const corpus& other) const
&& j == other.get_translation_units().end());
}
+void
+corpus::set_symtab(symtab_reader::symtab_sptr symtab)
+{priv_->symtab_ = symtab;}
+
+const symtab_reader::symtab_sptr&
+corpus::get_symtab() const
+{ return priv_->symtab_; }
+
/// Setter of the function symbols map.
///
/// @param map a shared pointer to the new function symbols map.
@@ -44,6 +44,7 @@ ABG_BEGIN_EXPORT_DECLARATIONS
#include "abg-dwarf-reader.h"
#include "abg-sptr-utils.h"
+#include "abg-symtab-reader.h"
#include "abg-tools-utils.h"
ABG_END_EXPORT_DECLARATIONS
@@ -2259,6 +2260,9 @@ public:
bool drop_undefined_syms_;
read_context();
+private:
+ mutable symtab_reader::symtab_sptr symtab_;
+
public:
/// Constructor of read_context.
@@ -2408,6 +2412,8 @@ public:
dt_soname_.clear();
elf_architecture_.clear();
+ symtab_.reset();
+
clear_per_translation_unit_data();
memset(&offline_callbacks_, 0, sizeof(offline_callbacks_));
@@ -5870,6 +5876,21 @@ public:
return symbol;
}
+ const symtab_reader::symtab_sptr&
+ symtab() const
+ {
+ if (!symtab_)
+ symtab_ = symtab_reader::symtab::load(
+ elf_handle(), options_.env, [&](const elf_symbol_sptr& symbol) {
+ return is_elf_symbol_suppressed(symbol);
+ });
+
+ if (!symtab_)
+ std::cerr << "Symbol table of '" << elf_path_
+ << "' could not be loaded\n";
+ return symtab_;
+ }
+
/// Getter for a pointer to the map that associates the address of
/// an entry point of a function with the symbol of that function.
///
@@ -16012,6 +16033,7 @@ read_debug_info_into_corpus(read_context& ctxt)
group->add_corpus(ctxt.current_corpus());
// Set symbols information to the corpus.
+ ctxt.current_corpus()->set_symtab(ctxt.symtab());
if (!get_ignore_symbol_table(ctxt))
{
if (ctxt.load_in_linux_kernel_mode()
@@ -17345,6 +17367,9 @@ read_corpus_from_elf(read_context& ctxt, status& status)
status |= STATUS_NO_SYMBOLS_FOUND;
}
+ if (!ctxt.symtab() || !ctxt.symtab()->has_symbols())
+ status |= STATUS_NO_SYMBOLS_FOUND;
+
if (// If no elf symbol was found ...
status & STATUS_NO_SYMBOLS_FOUND
// ... or if debug info was found but not the required alternate
@@ -33,6 +33,7 @@ ABG_BEGIN_EXPORT_DECLARATIONS
#include "abg-libxml-utils.h"
#include "abg-reader.h"
#include "abg-corpus.h"
+#include "abg-symtab-reader.h"
#ifdef WITH_ZIP_ARCHIVE
#include "abg-libzip-utils.h"
@@ -1907,6 +1908,8 @@ read_corpus_from_input(read_context& ctxt)
// Note that it's possible that both fn_sym_db and var_sym_db
// are nil, due to potential suppression specifications. That's
// fine.
+ corp.set_symtab(symtab_reader::symtab::load(fn_sym_db, var_sym_db));
+
if (fn_sym_db)
{
corp.set_fun_symbol_map(fn_sym_db);
@@ -1 +1 @@
-// empty!
+void exported_function(){}
GIT binary patch
delta 1147
zcmZWoOH31C5T3tV9tB!<%cHzPw**bm(Cq`-Vl{1*M`I!w5)LMqVl09tfFOpVCM?DW
zhJ&qhFdTd|AsW4SASPgpk#I5|(39dxV>oy)f(G?Kg0tN&N}SF7-_HE=`e*)Mj?a%L
z?3Q^iY*PsQV1N*mfh8HV<=OS>j$NNT<1l0~Rmw`HB*SdRXEwQVUGVEvX&Z5vSu2jN
zj>ggf#Ek7W;t0FD|IOD}WzFr0h4_JvUAv{Vajf89D27U`EMg^FHZg!mpGu0p>x*?7
zQ>+SmbUi{BDa=&z2Co|A;DWAO=#8Hp8X4`4MNgd{JUM!LXmGBSyIgRK-^l5T+*nN<
zUz+>P>kB7XB^RhAKaN;j+u8~dItlv;Hwa}yg^E=GcA*nkoM)8<Ik^ccPw}lHe*bN2
zE1loOx0=ch7v_)U$`Gsw?D5prD6WcsGx1BZ%T*LARi~Z1Nf@AHIf^oD;;-or8M6;k
zhB+pDHlpmXvrT;D=y3I9nymCdp)#dxBDF^VQ<?odRSkVuCrM1kW6}q+$5kgbIouAH
z=ytlDPLI<|9kga~z`&1_&Js=sJ%koErAU?f?ckYMY2auqGQM(-Q9)ss#O!GE6mc9F
zamZ!iOfZEhmxU#8*i}-_!^hyizUn^*0xpxS8Oo5kElk9>t`c1_;F{ZxA$L0~!keTv
z;X}8?jQGyo#udPQN>k4YvBP62H-i}38TK`a49qy;sc!+ur$O%AUnfxqd9azeAlmLP
z`e7gdgfxwcMqKw;=yK6o?xh*;xLg_2NZKZbwuYZVw5`1>+7gMjc7~6%L?g|eSkl<~
z{{_TlT{XrVujr%wu@U^<IE}KGH~f7sGhUyd4Oqik{N$AcZLAt5(B_i_ZTK4Y;R&B)
zkTX|8#u;B9dyLF~k3GkfUovRN-^3Mv8{YSdwu^KaIv+JhCA+v2FQKi;%C2I#DaevI
zN$VY4Y?@#XFuX6wp5P>{PjQjfXUGCkqd)!B0ZJ*19R~t?4RV7T@f@ZCKEsbjRa&A-
Gt$zTQCEAJr
delta 769
zcmYjPO=uHA6rPt&tQ(Uy+mLRmfhLHOs?Gl7XR~cF5sGcW9~6V+lp+dMywrnjJTz(j
zJKFexS`cbZA_yKrK~Igh9PLT;pqCy6Jy>W((An&6>0{=7^SycV-kUe`zFJ>cNy^0>
z+mj;8vxBV2WH!(!B>Zi`-f0VsTPcyqX4GgZqSra&ZG3qwF^|Js#2gKwL-oYf&gaYe
z@1AET?rp9f>8ssbT)rK#e63L3iG)|dE6)s~LWx*wQCJQ@_0B#GZCklpe?#8BR$O|}
zi+U<aJ9v}2s3n~&J}VHHw!;tDlubF@@9+|a6@{WGD_{Hd{BYb%=_xI)tGdcZ8k;oa
z6Rcveq(%e}OLCNHs>{5rZ6W#aPL=UZy~ay8qbXEJQ;Sd#Ynm+dvK7u`e9{Jl5RXE7
zge3gqJN+!qnG99GJIL2XyB?>D>@26mg4oa%3gD+cDIDUb=d>`+r4JACsHdI!9oXpl
zOQ@w~9{+iIWW>Y#Y=@`ZFI!zNZY=J%GWG{ek4z#G8JUiDb-~i8XTIZ3cA}>;edT=R
z`VBO*5o~22Vm`No?Oa&gds;|_A-S!0F^00CNN&SjT)--~y3gWb37Q_p4<m+-5kfRS
zLoZRyuhBX_dcrtm#zglnJGf*{HYP%tH9|CxU9&*<VU8B)396$tdVyWOZo(WZ&}&q=
mev1!dmEbSuw^|?UIF5~<6!RIo2^UZvH^fI-o2@&A1pWhng`7wL
@@ -53,14 +53,9 @@ TEST_CASE("Symtab::Empty", "[symtab, basic]")
const std::string binary = "basic/empty.so";
corpus_sptr corpus_ptr;
const dwarf_reader::status status = read_corpus(binary, corpus_ptr);
- REQUIRE(corpus_ptr);
-
- REQUIRE((status & dwarf_reader::STATUS_OK));
+ REQUIRE(!corpus_ptr);
- // TODO: Those two assertions are currently not met. Empty symtabs are
- // currently treated like the error case.
- // REQUIRE((status & dwarf_reader::STATUS_OK));
- // REQUIRE((status & dwarf_reader::STATUS_NO_SYMBOLS_FOUND));
+ REQUIRE((status & dwarf_reader::STATUS_NO_SYMBOLS_FOUND));
}
TEST_CASE("Symtab::NoDebugInfo", "[symtab, basic]")
@@ -70,9 +65,9 @@ TEST_CASE("Symtab::NoDebugInfo", "[symtab, basic]")
const dwarf_reader::status status = read_corpus(binary, corpus_ptr);
REQUIRE(corpus_ptr);
- REQUIRE(status
- == (dwarf_reader::STATUS_OK
- | dwarf_reader::STATUS_DEBUG_INFO_NOT_FOUND));
+ REQUIRE(
+ status
+ == (dwarf_reader::STATUS_OK | dwarf_reader::STATUS_DEBUG_INFO_NOT_FOUND));
}
// this value indicates in the following helper method, that we do not want to