mirror of
https://git.rtems.org/rtems-tools/
synced 2025-10-24 11:19:48 +08:00
rtemstoolkit/elf,files: Catch exceptions in destructors.
Catch exceptions in destructures and print a message to avoid an unhandled exception happening in an exception stack unwind.
This commit is contained in:
@@ -434,9 +434,23 @@ namespace rld
|
||||
}
|
||||
|
||||
file::~file ()
|
||||
{
|
||||
try
|
||||
{
|
||||
end ();
|
||||
}
|
||||
catch (rld::error re)
|
||||
{
|
||||
std::cerr << "error: rld::elf::file::~file: "
|
||||
<< re.where << ": " << re.what
|
||||
<< std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cerr << "error: rld::elf::file::~file: unhandled exception"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
file::reference_obtain ()
|
||||
@@ -447,6 +461,7 @@ namespace rld
|
||||
void
|
||||
file::reference_release ()
|
||||
{
|
||||
if (refs > 0)
|
||||
--refs;
|
||||
}
|
||||
|
||||
@@ -525,8 +540,7 @@ namespace rld
|
||||
if (archive_ && (ek != ELF_K_ELF))
|
||||
throw rld::error ("File format in archive not ELF",
|
||||
"elf:file:begin: " + name__);
|
||||
else
|
||||
{
|
||||
|
||||
if (ek == ELF_K_AR)
|
||||
archive = true;
|
||||
else if (ek == ELF_K_ELF)
|
||||
@@ -534,7 +548,6 @@ namespace rld
|
||||
else
|
||||
throw rld::error ("File format not ELF or archive",
|
||||
"elf:file:begin: " + name__);
|
||||
}
|
||||
|
||||
if (!writable_)
|
||||
{
|
||||
@@ -545,7 +558,7 @@ namespace rld
|
||||
if (ek == ELF_K_ELF)
|
||||
{
|
||||
oclass = ::gelf_getclass (elf__);
|
||||
ident_str = elf_getident (elf__, &ident_size);
|
||||
ident_str = ::elf_getident (elf__, &ident_size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -567,15 +580,6 @@ namespace rld
|
||||
if (refs > 0)
|
||||
throw rld::error ("References still held", "elf:file:end: " + name_);
|
||||
|
||||
if (elf_)
|
||||
{
|
||||
if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
|
||||
std::cout << "libelf::end: " << elf_
|
||||
<< ' ' << name_ << std::endl;
|
||||
::elf_end (elf_);
|
||||
elf_ = 0;
|
||||
}
|
||||
|
||||
if (fd_ >= 0)
|
||||
{
|
||||
if (!writable)
|
||||
@@ -595,12 +599,21 @@ namespace rld
|
||||
fd_ = -1;
|
||||
name_.clear ();
|
||||
archive = false;
|
||||
elf_ = 0;
|
||||
oclass = 0;
|
||||
ident_str = 0;
|
||||
ident_size = 0;
|
||||
writable = false;
|
||||
|
||||
secs.clear ();
|
||||
|
||||
if (elf_)
|
||||
{
|
||||
if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
|
||||
std::cout << "libelf::end: " << elf_
|
||||
<< ' ' << name_ << std::endl;
|
||||
::elf_end (elf_);
|
||||
elf_ = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -256,10 +256,12 @@ namespace rld
|
||||
image::~image ()
|
||||
{
|
||||
if (references_)
|
||||
std::cerr << "rtl:file:image: references when destructing";
|
||||
std::cerr << "rtl:file:image: references when destructing" << std::endl;
|
||||
|
||||
if (fd_ >= 0)
|
||||
{
|
||||
::close (fd_);
|
||||
fd_= -1;
|
||||
if (writable && remove)
|
||||
{
|
||||
if (rld::verbose () >= RLD_VERBOSE_INFO)
|
||||
@@ -268,6 +270,22 @@ namespace rld
|
||||
::unlink (name_.path ().c_str ());
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
elf_.end ();
|
||||
}
|
||||
catch (rld::error re)
|
||||
{
|
||||
std::cerr << "error: rld::files::image:::~image: "
|
||||
<< re.where << ": " << re.what
|
||||
<< std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cerr << "error: rld::files::image:::~image: unhandled exception"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -536,10 +554,24 @@ namespace rld
|
||||
}
|
||||
|
||||
archive::~archive ()
|
||||
{
|
||||
try
|
||||
{
|
||||
end ();
|
||||
close ();
|
||||
}
|
||||
catch (rld::error re)
|
||||
{
|
||||
std::cerr << "error: rld::files::archive::~archive: "
|
||||
<< re.where << ": " << re.what
|
||||
<< std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cerr << "error: rld::files::archive::~archive: unhandled exception"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
archive::begin ()
|
||||
@@ -959,10 +991,24 @@ namespace rld
|
||||
}
|
||||
|
||||
object::~object ()
|
||||
{
|
||||
try
|
||||
{
|
||||
end ();
|
||||
close ();
|
||||
}
|
||||
catch (rld::error re)
|
||||
{
|
||||
std::cerr << "error: rld::files::object::~object: "
|
||||
<< re.where << ": " << re.what
|
||||
<< std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cerr << "error: rld::files::object::~object: unhandled exception"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
object::open (bool writable)
|
||||
@@ -1317,9 +1363,23 @@ namespace rld
|
||||
}
|
||||
|
||||
cache::~cache ()
|
||||
{
|
||||
try
|
||||
{
|
||||
close ();
|
||||
}
|
||||
catch (rld::error re)
|
||||
{
|
||||
std::cerr << "error: rld::files:cache::~cache: "
|
||||
<< re.where << ": " << re.what
|
||||
<< std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cerr << "error: rld::files::cache::~cache: unhandled exception"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cache::open ()
|
||||
|
||||
Reference in New Issue
Block a user