1 /* BFD back-end for PDB Multi-Stream Format archives.
2 Copyright (C) 2022-2023 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
21 /* This describes the MSF file archive format, which is used for the
22 PDB debug info generated by MSVC. See https://llvm.org/docs/PDB/MsfFile.html
23 for a full description of the format. */
29 /* "Microsoft C/C++ MSF 7.00\r\n\x1a\x44\x53\0\0\0" */
30 static const uint8_t pdb_magic
[] =
31 { 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66,
32 0x74, 0x20, 0x43, 0x2f, 0x43, 0x2b, 0x2b, 0x20,
33 0x4d, 0x53, 0x46, 0x20, 0x37, 0x2e, 0x30, 0x30,
34 0x0d, 0x0a, 0x1a, 0x44, 0x53, 0x00, 0x00, 0x00 };
36 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
39 pdb_archive_p (bfd
*abfd
)
42 char magic
[sizeof (pdb_magic
)];
44 ret
= bfd_bread (magic
, sizeof (magic
), abfd
);
45 if (ret
!= sizeof (magic
))
47 bfd_set_error (bfd_error_wrong_format
);
51 if (memcmp (magic
, pdb_magic
, sizeof (magic
)))
53 bfd_set_error (bfd_error_wrong_format
);
57 void *tdata
= bfd_zalloc (abfd
, sizeof (struct artdata
));
60 bfd_ardata (abfd
) = tdata
;
62 return _bfd_no_cleanup
;
66 pdb_get_elt_at_index (bfd
*abfd
, symindex sym_index
)
68 char int_buf
[sizeof (uint32_t)];
69 uint32_t block_size
, block_map_addr
, block
, num_files
;
70 uint32_t first_dir_block
, dir_offset
, file_size
, block_off
, left
;
77 if (bfd_seek (abfd
, sizeof (pdb_magic
), SEEK_SET
))
80 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
82 bfd_set_error (bfd_error_malformed_archive
);
86 block_size
= bfd_getl32 (int_buf
);
87 if ((block_size
& -block_size
) != block_size
91 bfd_set_error (bfd_error_malformed_archive
);
95 /* Get block_map_addr. */
97 if (bfd_seek (abfd
, 4 * sizeof (uint32_t), SEEK_CUR
))
100 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
102 bfd_set_error (bfd_error_malformed_archive
);
106 block_map_addr
= bfd_getl32 (int_buf
);
110 if (bfd_seek (abfd
, block_map_addr
* block_size
, SEEK_SET
))
113 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
115 bfd_set_error (bfd_error_malformed_archive
);
119 first_dir_block
= bfd_getl32 (int_buf
);
121 if (bfd_seek (abfd
, first_dir_block
* block_size
, SEEK_SET
))
124 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
126 bfd_set_error (bfd_error_malformed_archive
);
130 num_files
= bfd_getl32 (int_buf
);
132 if (sym_index
>= num_files
)
134 bfd_set_error (bfd_error_no_more_archived_files
);
138 /* Read file size. */
140 dir_offset
= sizeof (uint32_t) * (sym_index
+ 1);
142 if (dir_offset
>= block_size
)
144 uint32_t block_map_addr_off
;
146 block_map_addr_off
= ((dir_offset
/ block_size
) * sizeof (uint32_t));
148 if (bfd_seek (abfd
, (block_map_addr
* block_size
) + block_map_addr_off
,
152 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
154 bfd_set_error (bfd_error_malformed_archive
);
158 block
= bfd_getl32 (int_buf
);
162 block
= first_dir_block
;
165 if (bfd_seek (abfd
, (block
* block_size
) + (dir_offset
% block_size
),
169 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
171 bfd_set_error (bfd_error_malformed_archive
);
175 file_size
= bfd_getl32 (int_buf
);
177 /* Undocumented? Seen on PDBs created by MSVC 2022. */
178 if (file_size
== 0xffffffff)
183 /* Four hex digits is enough - even though MSF allows for 32 bits, the
184 PDB format itself only uses 16 bits for stream numbers. */
185 sprintf (name
, "%04lx", sym_index
);
187 file
= bfd_create (name
, abfd
);
192 if (!bfd_make_writable (file
))
196 (struct areltdata
*) bfd_zmalloc (sizeof (struct areltdata
));
198 if (!file
->arelt_data
)
201 arch_eltdata (file
)->parsed_size
= file_size
;
202 arch_eltdata (file
)->key
= sym_index
;
209 /* Sum number of blocks in previous files. */
213 dir_offset
= sizeof (uint32_t);
215 if (bfd_seek (abfd
, (first_dir_block
* block_size
) + sizeof (uint32_t),
219 for (symindex i
= 0; i
< sym_index
; i
++)
221 uint32_t size
, num_blocks
;
223 if ((dir_offset
% block_size
) == 0)
225 uint32_t block_map_addr_off
;
228 ((dir_offset
/ block_size
) * sizeof (uint32_t));
231 (abfd
, (block_map_addr
* block_size
) + block_map_addr_off
,
235 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) !=
238 bfd_set_error (bfd_error_malformed_archive
);
242 block
= bfd_getl32 (int_buf
);
244 if (bfd_seek (abfd
, block
* block_size
, SEEK_SET
))
248 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) !=
251 bfd_set_error (bfd_error_malformed_archive
);
255 size
= bfd_getl32 (int_buf
);
257 if (size
== 0xffffffff)
260 num_blocks
= (size
+ block_size
- 1) / block_size
;
261 block_off
+= num_blocks
;
263 dir_offset
+= sizeof (uint32_t);
267 /* Read blocks, and write into new BFD. */
269 dir_offset
= sizeof (uint32_t) * (num_files
+ block_off
+ 1);
271 if (dir_offset
>= block_size
)
273 uint32_t block_map_addr_off
;
275 block_map_addr_off
= ((dir_offset
/ block_size
) * sizeof (uint32_t));
277 if (bfd_seek (abfd
, (block_map_addr
* block_size
) + block_map_addr_off
,
281 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
283 bfd_set_error (bfd_error_malformed_archive
);
287 block
= bfd_getl32 (int_buf
);
291 block
= first_dir_block
;
294 buf
= bfd_malloc (block_size
);
301 uint32_t file_block
, to_read
;
303 if ((dir_offset
% block_size
) == 0 && left
!= file_size
)
305 uint32_t block_map_addr_off
;
308 ((dir_offset
/ block_size
) * sizeof (uint32_t));
311 (abfd
, (block_map_addr
* block_size
) + block_map_addr_off
,
315 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) !=
318 bfd_set_error (bfd_error_malformed_archive
);
322 block
= bfd_getl32 (int_buf
);
325 if (bfd_seek (abfd
, (block
* block_size
) + (dir_offset
% block_size
),
329 if (bfd_bread (int_buf
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
331 bfd_set_error (bfd_error_malformed_archive
);
335 file_block
= bfd_getl32 (int_buf
);
337 if (bfd_seek (abfd
, file_block
* block_size
, SEEK_SET
))
340 to_read
= left
> block_size
? block_size
: left
;
342 if (bfd_bread (buf
, to_read
, abfd
) != to_read
)
344 bfd_set_error (bfd_error_malformed_archive
);
348 if (bfd_bwrite (buf
, to_read
, file
) != to_read
)
351 if (left
> block_size
)
356 dir_offset
+= sizeof (uint32_t);
373 pdb_openr_next_archived_file (bfd
*archive
, bfd
*last_file
)
376 return pdb_get_elt_at_index (archive
, 0);
378 return pdb_get_elt_at_index (archive
, arch_eltdata (last_file
)->key
+ 1);
382 pdb_generic_stat_arch_elt (bfd
*abfd
, struct stat
*buf
)
388 buf
->st_size
= arch_eltdata (abfd
)->parsed_size
;
394 pdb_allocate_block (uint32_t *num_blocks
, uint32_t block_size
)
402 /* If new interval, skip two blocks for free space map. */
404 if ((block
% block_size
) == 1)
414 pdb_write_directory (bfd
*abfd
, uint32_t block_size
, uint32_t num_files
,
415 uint32_t block_map_addr
, uint32_t * num_blocks
)
417 char tmp
[sizeof (uint32_t)];
418 uint32_t block
, left
, block_map_off
;
422 /* Allocate first block for directory. */
424 block
= pdb_allocate_block (num_blocks
, block_size
);
427 /* Write allocated block no. at beginning of block map. */
429 if (bfd_seek (abfd
, block_map_addr
* block_size
, SEEK_SET
))
432 bfd_putl32 (block
, tmp
);
434 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
437 block_map_off
= sizeof (uint32_t);
439 /* Write num_files at beginning of directory. */
441 if (bfd_seek (abfd
, block
* block_size
, SEEK_SET
))
444 bfd_putl32 (num_files
, tmp
);
446 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
449 left
-= sizeof (uint32_t);
451 /* Write file sizes. */
453 arelt
= abfd
->archive_head
;
458 if (block_map_off
== block_size
) /* Too many blocks. */
460 bfd_set_error (bfd_error_invalid_operation
);
464 block
= pdb_allocate_block (num_blocks
, block_size
);
468 (abfd
, (block_map_addr
* block_size
) + block_map_off
, SEEK_SET
))
471 bfd_putl32 (block
, tmp
);
473 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
476 block_map_off
+= sizeof (uint32_t);
478 if (bfd_seek (abfd
, block
* block_size
, SEEK_SET
))
482 bfd_putl32 (bfd_get_size (arelt
), tmp
);
484 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
487 left
-= sizeof (uint32_t);
489 arelt
= arelt
->archive_next
;
494 buf
= bfd_malloc (block_size
);
498 arelt
= abfd
->archive_head
;
501 ufile_ptr size
= bfd_get_size (arelt
);
502 uint32_t req_blocks
= (size
+ block_size
- 1) / block_size
;
504 if (bfd_seek (arelt
, 0, SEEK_SET
))
510 for (uint32_t i
= 0; i
< req_blocks
; i
++)
512 uint32_t file_block
, to_read
;
516 if (block_map_off
== block_size
) /* Too many blocks. */
518 bfd_set_error (bfd_error_invalid_operation
);
523 block
= pdb_allocate_block (num_blocks
, block_size
);
527 (abfd
, (block_map_addr
* block_size
) + block_map_off
,
534 bfd_putl32 (block
, tmp
);
536 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) !=
543 block_map_off
+= sizeof (uint32_t);
545 if (bfd_seek (abfd
, block
* block_size
, SEEK_SET
))
552 /* Allocate block and write number into directory. */
554 file_block
= pdb_allocate_block (num_blocks
, block_size
);
556 bfd_putl32 (file_block
, tmp
);
558 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
564 left
-= sizeof (uint32_t);
566 /* Read file contents into buffer. */
568 to_read
= size
> block_size
? block_size
: size
;
570 if (bfd_bread (buf
, to_read
, arelt
) != to_read
)
578 if (to_read
< block_size
)
579 memset (buf
+ to_read
, 0, block_size
- to_read
);
581 if (bfd_seek (abfd
, file_block
* block_size
, SEEK_SET
))
587 /* Write file contents into allocated block. */
589 if (bfd_bwrite (buf
, block_size
, abfd
) != block_size
)
596 (abfd
, (block
* block_size
) + block_size
- left
, SEEK_SET
))
603 arelt
= arelt
->archive_next
;
606 memset (buf
, 0, left
);
608 if (bfd_bwrite (buf
, left
, abfd
) != left
)
620 pdb_write_bitmap (bfd
*abfd
, uint32_t block_size
, uint32_t num_blocks
)
623 uint32_t num_intervals
= (num_blocks
+ block_size
- 1) / block_size
;
625 buf
= bfd_malloc (block_size
);
629 num_blocks
--; /* Superblock not included. */
631 for (uint32_t i
= 0; i
< num_intervals
; i
++)
633 if (bfd_seek (abfd
, ((i
* block_size
) + 1) * block_size
, SEEK_SET
))
639 /* All of our blocks are contiguous, making our free block map simple.
640 0 = used, 1 = free. */
645 block_size
? block_size
: (num_blocks
/ 8));
647 if (num_blocks
< block_size
* 8)
649 unsigned int off
= num_blocks
/ 8;
653 buf
[off
] = (1 << (8 - (num_blocks
% 8))) - 1;
657 if (off
< block_size
)
658 memset (buf
+ off
, 0xff, block_size
- off
);
661 if (num_blocks
< block_size
* 8)
664 num_blocks
-= block_size
* 8;
666 if (bfd_bwrite (buf
, block_size
, abfd
) != block_size
)
676 pdb_write_contents (bfd
*abfd
)
678 char tmp
[sizeof (uint32_t)];
679 const uint32_t block_size
= 0x400;
680 uint32_t block_map_addr
;
682 uint32_t num_files
= 0;
683 uint32_t num_directory_bytes
= sizeof (uint32_t);
686 if (bfd_bwrite (pdb_magic
, sizeof (pdb_magic
), abfd
) != sizeof (pdb_magic
))
689 bfd_putl32 (block_size
, tmp
);
691 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
694 bfd_putl32 (1, tmp
); /* Free block map block (always either 1 or 2). */
696 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
699 arelt
= abfd
->archive_head
;
703 uint32_t blocks_required
=
704 (bfd_get_size (arelt
) + block_size
- 1) / block_size
;
706 num_directory_bytes
+= sizeof (uint32_t); /* Size. */
707 num_directory_bytes
+= blocks_required
* sizeof (uint32_t); /* Blocks. */
711 arelt
= arelt
->archive_next
;
714 /* Superblock plus two bitmap blocks. */
717 /* Skip num_blocks for now. */
718 if (bfd_seek (abfd
, sizeof (uint32_t), SEEK_CUR
))
721 bfd_putl32 (num_directory_bytes
, tmp
);
723 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
726 /* Skip unknown uint32_t (always 0?). */
727 if (bfd_seek (abfd
, sizeof (uint32_t), SEEK_CUR
))
730 block_map_addr
= pdb_allocate_block (&num_blocks
, block_size
);
732 bfd_putl32 (block_map_addr
, tmp
);
734 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
737 if (!pdb_write_directory
738 (abfd
, block_size
, num_files
, block_map_addr
, &num_blocks
))
741 if (!pdb_write_bitmap (abfd
, block_size
, num_blocks
))
744 /* Write num_blocks now we know it. */
747 (abfd
, sizeof (pdb_magic
) + sizeof (uint32_t) + sizeof (uint32_t),
751 bfd_putl32 (num_blocks
, tmp
);
753 if (bfd_bwrite (tmp
, sizeof (uint32_t), abfd
) != sizeof (uint32_t))
759 #define pdb_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
760 #define pdb_new_section_hook _bfd_generic_new_section_hook
761 #define pdb_get_section_contents _bfd_generic_get_section_contents
762 #define pdb_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
763 #define pdb_close_and_cleanup _bfd_generic_close_and_cleanup
765 #define pdb_slurp_armap _bfd_noarchive_slurp_armap
766 #define pdb_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
767 #define pdb_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
768 #define pdb_truncate_arname _bfd_noarchive_truncate_arname
769 #define pdb_write_armap _bfd_noarchive_write_armap
770 #define pdb_read_ar_hdr _bfd_noarchive_read_ar_hdr
771 #define pdb_write_ar_hdr _bfd_noarchive_write_ar_hdr
772 #define pdb_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
774 const bfd_target pdb_vec
=
777 bfd_target_unknown_flavour
,
778 BFD_ENDIAN_LITTLE
, /* target byte order */
779 BFD_ENDIAN_LITTLE
, /* target headers byte order */
780 0, /* object flags */
781 0, /* section flags */
782 0, /* leading underscore */
783 ' ', /* ar_pad_char */
784 16, /* ar_max_namelen */
785 0, /* match priority. */
786 TARGET_KEEP_UNUSED_SECTION_SYMBOLS
, /* keep unused section symbols. */
787 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
788 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
789 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* Data. */
790 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
791 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
792 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* Hdrs. */
794 { /* bfd_check_format */
800 { /* bfd_set_format */
801 _bfd_bool_bfd_false_error
,
802 _bfd_bool_bfd_false_error
,
804 _bfd_bool_bfd_false_error
806 { /* bfd_write_contents */
808 _bfd_bool_bfd_false_error
,
810 _bfd_bool_bfd_false_error
813 BFD_JUMP_TABLE_GENERIC (pdb
),
814 BFD_JUMP_TABLE_COPY (_bfd_generic
),
815 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
816 BFD_JUMP_TABLE_ARCHIVE (pdb
),
817 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols
),
818 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs
),
819 BFD_JUMP_TABLE_WRITE (_bfd_generic
),
820 BFD_JUMP_TABLE_LINK (_bfd_nolink
),
821 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),