@@ -3369,6 +3369,10 @@ void info_guts(memory_access &raw_access, void *con) {
3369
3369
if (image_def->tbyb ()) {
3370
3370
info_pair (" tbyb" , " not bought" );
3371
3371
}
3372
+
3373
+ if (verbose_metadata) {
3374
+ info_pair (" extra security" , image_def->extra_security () ? " enabled" : " not enabled" );
3375
+ }
3372
3376
}
3373
3377
3374
3378
// Partition Table
@@ -5086,9 +5090,11 @@ void sign_guts_elf(elf_file* elf, private_t private_key, public_t public_key) {
5086
5090
new_block.items .push_back (version);
5087
5091
}
5088
5092
5089
- // Add entry point when signing Arm images
5093
+ // Add entry point and vector table when signing Arm images, and set PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS
5090
5094
std::shared_ptr<image_type_item> image_type = new_block.get_item <image_type_item>();
5091
5095
if (settings.seal .sign && image_type != nullptr && image_type->image_type () == type_exe && image_type->cpu () == cpu_arm) {
5096
+ // Set PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS
5097
+ image_type->flags |= PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS;
5092
5098
std::shared_ptr<entry_point_item> entry_point = new_block.get_item <entry_point_item>();
5093
5099
if (entry_point == nullptr ) {
5094
5100
std::shared_ptr<vector_table_item> vtor = new_block.get_item <vector_table_item>();
@@ -5107,6 +5113,9 @@ void sign_guts_elf(elf_file* elf, private_t private_key, public_t public_key) {
5107
5113
vtor_loc += rwd->addr ;
5108
5114
}
5109
5115
}
5116
+
5117
+ vtor = std::make_shared<vector_table_item>(vtor_loc);
5118
+ new_block.items .push_back (vtor);
5110
5119
}
5111
5120
auto segment = elf->segment_from_virtual_address (vtor_loc);
5112
5121
if (segment == nullptr ) {
@@ -5167,15 +5176,20 @@ vector<uint8_t> sign_guts_bin(iostream_memory_access in, private_t private_key,
5167
5176
new_block.items .push_back (version);
5168
5177
}
5169
5178
5170
- // Add entry point when signing Arm images
5179
+ // Add entry point and vector table when signing Arm images, and set PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS
5171
5180
std::shared_ptr<image_type_item> image_type = new_block.get_item <image_type_item>();
5172
5181
if (settings.seal .sign && image_type != nullptr && image_type->image_type () == type_exe && image_type->cpu () == cpu_arm) {
5182
+ // Set PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS
5183
+ image_type->flags |= PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS;
5173
5184
std::shared_ptr<entry_point_item> entry_point = new_block.get_item <entry_point_item>();
5174
5185
if (entry_point == nullptr ) {
5175
5186
std::shared_ptr<vector_table_item> vtor = new_block.get_item <vector_table_item>();
5176
5187
uint32_t vtor_loc = bin_start;
5177
5188
if (vtor != nullptr ) {
5178
5189
vtor_loc = vtor->addr ;
5190
+ } else {
5191
+ vtor = std::make_shared<vector_table_item>(vtor_loc);
5192
+ new_block.items .push_back (vtor);
5179
5193
}
5180
5194
auto offset = vtor_loc - bin_start;
5181
5195
uint32_t ep;
0 commit comments