diff --git a/SConscript b/SConscript
index 47665fe81787337d0d6911e78ff7f972eaa14f31..932057a93c601dc177601a387794d7153b1b8f44 100644
--- a/SConscript
+++ b/SConscript
@@ -19,6 +19,8 @@ import os
 Import('env')
 
 env.Replace(debug=ARGUMENTS.get("debug",0))
+env.Append(CFLAGS=" -DUSE_ELFIO ")
+env.Append(CXXFLAGS=" -DUSE_ELFIO ")
 if int(env['debug']) == 1:
         print "Setting debug mode"
         env.Append(CFLAGS=" -g ")
diff --git a/src/ehp.cpp b/src/ehp.cpp
index bcc41fc4569107d7098c121735c8011d96678e47..02b6305dfbbe89d377a224c0245feb17d3d323e6 100644
--- a/src/ehp.cpp
+++ b/src/ehp.cpp
@@ -290,7 +290,7 @@ template <int ptrsize>
 void eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const
 {
 	// make sure uint8_t is an unsigned char.	
-	static_assert(std::is_same<unsigned char, uint8_t>::value, "uint8_t is not unsigned char");
+	static_assert(is_same<unsigned char, uint8_t>::value, "uint8_t is not unsigned char");
 
 	auto &data=program_bytes;
 	auto opcode=program_bytes[0];
@@ -502,10 +502,10 @@ void eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const
 }
 
 template <int ptrsize>
-std::tuple<std::string, int64_t, int64_t> eh_program_insn_t<ptrsize>::decode() const
+tuple<string, int64_t, int64_t> eh_program_insn_t<ptrsize>::decode() const
 {
     // make sure uint8_t is an unsigned char.
-    static_assert(std::is_same<unsigned char, uint8_t>::value, "uint8_t is not unsigned char");
+    static_assert(is_same<unsigned char, uint8_t>::value, "uint8_t is not unsigned char");
 
     auto& data = program_bytes;
     auto opcode = program_bytes[0];
@@ -520,51 +520,51 @@ std::tuple<std::string, int64_t, int64_t> eh_program_insn_t<ptrsize>::decode() c
     {
         case 1:
             // case DW_CFA_advance_loc:
-            return std::make_tuple("cf_advance_loc", +opcode_lower6, 0);
+            return make_tuple("cf_advance_loc", +opcode_lower6, 0);
         case 2:
             if(eh_frame_util_t<ptrsize>::read_uleb128(uleb, pos, (const uint8_t* const)data.data(),
                                                       max))
-                return std::make_tuple("unexpected_error", 0, 0);
+                return make_tuple("unexpected_error", 0, 0);
             // case DW_CFA_offset:
-            return std::make_tuple("offset", +opcode_lower6, uleb);
+            return make_tuple("offset", +opcode_lower6, uleb);
         case 3:
             // case DW_CFA_restore (register #):
-            return std::make_tuple("restore", +opcode_lower6, 0);
+            return make_tuple("restore", +opcode_lower6, 0);
         case 0:
             switch(opcode_lower6)
             {
                 case DW_CFA_nop:
-                    return std::make_tuple("nop", 0, 0);
+                    return make_tuple("nop", 0, 0);
                 case DW_CFA_remember_state:
-                    return std::make_tuple("remember_state", 0, 0);
+                    return make_tuple("remember_state", 0, 0);
                 case DW_CFA_restore_state:
-                    return std::make_tuple("restore_state", 0, 0);
+                    return make_tuple("restore_state", 0, 0);
                 // takes single uleb128
                 case DW_CFA_undefined:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("undefined", uleb, 0);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("undefined", uleb, 0);
                 case DW_CFA_same_value:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("same_value", uleb, 0);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("same_value", uleb, 0);
                 case DW_CFA_restore_extended:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("restore_extended", uleb, 0);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("restore_extended", uleb, 0);
                 case DW_CFA_def_cfa_register:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("def_cfa_register", uleb, 0);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("def_cfa_register", uleb, 0);
                 case DW_CFA_def_cfa_offset:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("def_cfa_offset", uleb, 0);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("def_cfa_offset", uleb, 0);
                 case DW_CFA_set_loc:
                 {
                     auto arg = uintptr_t(0xDEADBEEF);
@@ -577,75 +577,75 @@ std::tuple<std::string, int64_t, int64_t> eh_program_insn_t<ptrsize>::decode() c
                             arg = *(uint64_t*)&data.data()[pos];
                             break;
                     }
-                    return std::make_tuple("set_loc", arg, 0);
+                    return make_tuple("set_loc", arg, 0);
                 }
                 case DW_CFA_advance_loc1:
                 {
                     auto loc = *(uint8_t*)(&data.data()[pos]);
-                    return std::make_tuple("advance_loc", loc, 0);
+                    return make_tuple("advance_loc", loc, 0);
                 }
 
                 case DW_CFA_advance_loc2:
                 {
                     auto loc = *(uint16_t*)(&data.data()[pos]);
-                    return std::make_tuple("advance_loc", loc, 0);
+                    return make_tuple("advance_loc", loc, 0);
                 }
 
                 case DW_CFA_advance_loc4:
                 {
                     auto loc = *(uint32_t*)(&data.data()[pos]);
-                    return std::make_tuple("advance_loc", loc, 0);
+                    return make_tuple("advance_loc", loc, 0);
                 }
                 case DW_CFA_offset_extended:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
+                        return make_tuple("unexpected_error", 0, 0);
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb2, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("offset_extended", uleb, uleb2);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("offset_extended", uleb, uleb2);
                 case DW_CFA_register:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
+                        return make_tuple("unexpected_error", 0, 0);
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb2, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("register", uleb, uleb2);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("register", uleb, uleb2);
 
                 case DW_CFA_def_cfa:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
+                        return make_tuple("unexpected_error", 0, 0);
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb2, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("def_cfa", uleb, uleb2);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("def_cfa", uleb, uleb2);
 
                 case DW_CFA_def_cfa_sf:
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
+                        return make_tuple("unexpected_error", 0, 0);
                     if(eh_frame_util_t<ptrsize>::read_sleb128(
                            sleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("def_cfa_sf", uleb, sleb);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("def_cfa_sf", uleb, sleb);
                 case DW_CFA_def_cfa_offset_sf:
                 {
                     if(eh_frame_util_t<ptrsize>::read_sleb128(
                            sleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("def_cfa_offset_sf", sleb, 0);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("def_cfa_offset_sf", sleb, 0);
                 }
                 case DW_CFA_offset_extended_sf:
                 {
                     if(eh_frame_util_t<ptrsize>::read_uleb128(
                            uleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
+                        return make_tuple("unexpected_error", 0, 0);
                     if(eh_frame_util_t<ptrsize>::read_sleb128(
                            sleb, pos, (const uint8_t* const)data.data(), max))
-                        return std::make_tuple("unexpected_error", 0, 0);
-                    return std::make_tuple("offset_extended_sf", uleb, sleb);
+                        return make_tuple("unexpected_error", 0, 0);
+                    return make_tuple("offset_extended_sf", uleb, sleb);
                 }
 
                 case DW_CFA_def_cfa_expression:
@@ -658,10 +658,10 @@ std::tuple<std::string, int64_t, int64_t> eh_program_insn_t<ptrsize>::decode() c
                 case DW_CFA_GNU_window_save:
                 case DW_CFA_GNU_negative_offset_extended:
                 default:
-                    return std::make_tuple("unhandled_instruction", 0, 0);
+                    return make_tuple("unhandled_instruction", 0, 0);
             }
 		default:
-			return std::make_tuple("unhandled_instruction", 0, 0);
+			return make_tuple("unhandled_instruction", 0, 0);
     }
 }
 
@@ -919,7 +919,7 @@ template <int ptrsize>
 bool eh_program_insn_t<ptrsize>::advance(uint64_t &cur_addr, uint64_t CAF) const 
 { 
 	// make sure uint8_t is an unsigned char.	
-	static_assert(std::is_same<unsigned char, uint8_t>::value, "uint8_t is not unsigned char");
+	static_assert(is_same<unsigned char, uint8_t>::value, "uint8_t is not unsigned char");
 
 	auto &data=program_bytes;
 	auto opcode=program_bytes[0];
@@ -2004,7 +2004,7 @@ unique_ptr<const EHFrameParser_t> EHFrameParser_t::factory(
 	else if(ptrsize==8)
 		ret_val=new split_eh_frame_impl_t<8>(eh_frame_sr,eh_frame_hdr_sr,gcc_except_table_sr);
 	else
-		throw std::out_of_range("ptrsize must be 4 or 8");
+		throw out_of_range("ptrsize must be 4 or 8");
 
 	ret_val->parse();
 
diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp
index b7bb414d48e67a3e6ec6b0641658d0b52e4f895e..c399a966f53850433fe0f3ce5b51e4dede29db8f 100644
--- a/src/ehp_priv.hpp
+++ b/src/ehp_priv.hpp
@@ -89,7 +89,7 @@ class eh_program_insn_t  : public EHProgramInstruction_t
 	eh_program_insn_t(const string &s) ;
 
 	void print(uint64_t &pc, int64_t caf) const;
-	std::tuple<std::string, int64_t, int64_t> decode() const;
+	tuple<string, int64_t, int64_t> decode() const;
 	uint64_t getSize() const { return program_bytes.size(); }
 	void push_byte(uint8_t c) ;