aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorMark Harmstone <mark@harmstone.com>2022-10-17 00:24:18 +0100
committerAlan Modra <amodra@gmail.com>2022-10-20 15:22:37 +1030
commitf6f30f347bb97898a74e59a841982170e42bb265 (patch)
tree966ab495055389361fb61cc34836818bc7890bc1 /bfd
parent97df7412a183b73a1bfaeed55a4d951c2aede7d4 (diff)
downloadgdb-f6f30f347bb97898a74e59a841982170e42bb265.zip
gdb-f6f30f347bb97898a74e59a841982170e42bb265.tar.gz
gdb-f6f30f347bb97898a74e59a841982170e42bb265.tar.bz2
ld: Add --pdb option
Second patch incorporates fixes for endian and UB issues in calc_hash, as per https://sourceware.org/pipermail/binutils/2022-October/123514.html.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/libpei.h6
-rw-r--r--bfd/peXXigen.c30
-rw-r--r--bfd/peicode.h2
3 files changed, 28 insertions, 10 deletions
diff --git a/bfd/libpei.h b/bfd/libpei.h
index dcf42f9..98e951d 100644
--- a/bfd/libpei.h
+++ b/bfd/libpei.h
@@ -423,9 +423,11 @@ void _bfd_XX_get_symbol_info (bfd *, asymbol *, symbol_info *);
bool _bfd_XXi_final_link_postscript (bfd *, struct coff_final_link_info *);
void _bfd_XXi_swap_debugdir_in (bfd *, void *, void *);
unsigned _bfd_XXi_swap_debugdir_out (bfd *, void *, void *);
-unsigned _bfd_XXi_write_codeview_record (bfd *, file_ptr, CODEVIEW_INFO *);
+unsigned _bfd_XXi_write_codeview_record
+ (bfd *, file_ptr, CODEVIEW_INFO *, const char *);
CODEVIEW_INFO *_bfd_XXi_slurp_codeview_record
- (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo);
+ (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo,
+ char **pdb);
/* The following are needed only for ONE of pe or pei, but don't
otherwise vary; peicode.h fixes up ifdefs but we provide the
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index e74ed39..c5a7f7b 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -1122,7 +1122,8 @@ _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp)
}
CODEVIEW_INFO *
-_bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo)
+_bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo,
+ char **pdb)
{
char buffer[256+1];
bfd_size_type nread;
@@ -1162,6 +1163,9 @@ _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length
cvinfo->SignatureLength = CV_INFO_SIGNATURE_LENGTH;
/* cvinfo->PdbFileName = cvinfo70->PdbFileName; */
+ if (pdb)
+ *pdb = xstrdup (cvinfo70->PdbFileName);
+
return cvinfo;
}
else if ((cvinfo->CVSignature == CVINFO_PDB20_CVSIGNATURE)
@@ -1173,6 +1177,9 @@ _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length
cvinfo->SignatureLength = 4;
/* cvinfo->PdbFileName = cvinfo20->PdbFileName; */
+ if (pdb)
+ *pdb = xstrdup (cvinfo20->PdbFileName);
+
return cvinfo;
}
@@ -1180,9 +1187,11 @@ _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length
}
unsigned int
-_bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo)
+_bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo,
+ const char *pdb)
{
- const bfd_size_type size = sizeof (CV_INFO_PDB70) + 1;
+ size_t pdb_len = pdb ? strlen (pdb) : 0;
+ const bfd_size_type size = sizeof (CV_INFO_PDB70) + pdb_len + 1;
bfd_size_type written;
CV_INFO_PDB70 *cvinfo70;
char * buffer;
@@ -1205,7 +1214,11 @@ _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinf
memcpy (&(cvinfo70->Signature[8]), &(cvinfo->Signature[8]), 8);
H_PUT_32 (abfd, cvinfo->Age, cvinfo70->Age);
- cvinfo70->PdbFileName[0] = '\0';
+
+ if (pdb == NULL)
+ cvinfo70->PdbFileName[0] = '\0';
+ else
+ memcpy (cvinfo70->PdbFileName, pdb, pdb_len + 1);
written = bfd_bwrite (buffer, size, abfd);
@@ -2603,22 +2616,25 @@ pe_print_debugdata (bfd * abfd, void * vfile)
We need to use a 32-bit aligned buffer
to safely read in a codeview record. */
char buffer[256 + 1] ATTRIBUTE_ALIGNED_ALIGNOF (CODEVIEW_INFO);
+ char *pdb;
CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
/* The debug entry doesn't have to have to be in a section,
in which case AddressOfRawData is 0, so always use PointerToRawData. */
if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData,
- idd.SizeOfData, cvinfo))
+ idd.SizeOfData, cvinfo, &pdb))
continue;
for (j = 0; j < cvinfo->SignatureLength; j++)
sprintf (&signature[j*2], "%02x", cvinfo->Signature[j] & 0xff);
/* xgettext:c-format */
- fprintf (file, _("(format %c%c%c%c signature %s age %ld)\n"),
+ fprintf (file, _("(format %c%c%c%c signature %s age %ld pdb %s)\n"),
buffer[0], buffer[1], buffer[2], buffer[3],
- signature, cvinfo->Age);
+ signature, cvinfo->Age, pdb[0] ? pdb : "(none)");
+
+ free (pdb);
}
}
diff --git a/bfd/peicode.h b/bfd/peicode.h
index add8d82..f7ba24a 100644
--- a/bfd/peicode.h
+++ b/bfd/peicode.h
@@ -1402,7 +1402,7 @@ pe_bfd_read_buildid (bfd *abfd)
*/
if (_bfd_XXi_slurp_codeview_record (abfd,
(file_ptr) idd.PointerToRawData,
- idd.SizeOfData, cvinfo))
+ idd.SizeOfData, cvinfo, NULL))
{
struct bfd_build_id* build_id = bfd_alloc (abfd,
sizeof (struct bfd_build_id) + cvinfo->SignatureLength);