* incremental.h (can_incremental_update): New function.
* layout.cc (Layout::init_fixed_output_section): Call it.
(Layout::make_output_section): Don't allow patch space in .eh_frame.
* object.cc (Sized_relobj_file::do_layout): Call
can_incremental_update.
+2011-09-18 Cary Coutant <ccoutant@google.com>
+
+ * incremental.cc (can_incremental_update): New function.
+ * incremental.h (can_incremental_update): New function.
+ * layout.cc (Layout::init_fixed_output_section): Call it.
+ (Layout::make_output_section): Don't allow patch space in .eh_frame.
+ * object.cc (Sized_relobj_file::do_layout): Call
+ can_incremental_update.
+
2011-09-13 Cary Coutant <ccoutant@google.com>
* configure.ac: Check for glibc support for gnu_indirect_function
va_end(args);
}
+// Return TRUE if a section of type SH_TYPE will can be updated in place
+// during an incremental update. We can update sections of type PROGBITS,
+// NOBITS, INIT_ARRAY, FINI_ARRAY, PREINIT_ARRAY, and NOTE. All others
+// will be regenerated.
+
+bool
+can_incremental_update(unsigned int sh_type)
+{
+ return (sh_type == elfcpp::SHT_PROGBITS
+ || sh_type == elfcpp::SHT_NOBITS
+ || sh_type == elfcpp::SHT_INIT_ARRAY
+ || sh_type == elfcpp::SHT_FINI_ARRAY
+ || sh_type == elfcpp::SHT_PREINIT_ARRAY
+ || sh_type == elfcpp::SHT_NOTE);
+}
+
// Find the .gnu_incremental_inputs section and related sections.
template<int size, bool big_endian>
static const int INCREMENTAL_SHLIB_SYM_FLAGS_SHIFT = 30;
+// Return TRUE if a section of type SH_TYPE will can be updated in place
+// during an incremental update.
+bool
+can_incremental_update(unsigned int sh_type);
+
// Create an Incremental_binary object for FILE. Returns NULL is this is not
// possible, e.g. FILE is not an ELF file or has an unsupported target.
{
unsigned int sh_type = shdr.get_sh_type();
- // We preserve the layout of PROGBITS, NOBITS, and NOTE sections.
+ // We preserve the layout of PROGBITS, NOBITS, INIT_ARRAY, FINI_ARRAY,
+ // PRE_INIT_ARRAY, and NOTE sections.
// All others will be created from scratch and reallocated.
- if (sh_type != elfcpp::SHT_PROGBITS
- && sh_type != elfcpp::SHT_NOBITS
- && sh_type != elfcpp::SHT_NOTE)
+ if (!can_incremental_update(sh_type))
return NULL;
typename elfcpp::Elf_types<size>::Elf_Addr sh_addr = shdr.get_sh_addr();
&& order != ORDER_FINI
&& order != ORDER_RELRO_LAST
&& order != ORDER_NON_RELRO_FIRST
+ && strcmp(name, ".eh_frame") != 0
&& strcmp(name, ".ctors") != 0
&& strcmp(name, ".dtors") != 0
&& strcmp(name, ".jcr") != 0)
Incremental_inputs* incremental_inputs = layout->incremental_inputs();
if (incremental_inputs != NULL
&& !discard
- && (shdr.get_sh_type() == elfcpp::SHT_PROGBITS
- || shdr.get_sh_type() == elfcpp::SHT_NOBITS
- || shdr.get_sh_type() == elfcpp::SHT_NOTE))
+ && can_incremental_update(shdr.get_sh_type()))
{
off_t sh_size = shdr.get_sh_size();
section_size_type uncompressed_size;