1.1 --- a/libexec/lib/src/elf.cc Thu Jun 02 01:09:30 2022 +0200
1.2 +++ b/libexec/lib/src/elf.cc Fri Jun 03 00:21:10 2022 +0200
1.3 @@ -25,26 +25,13 @@
1.4
1.5
1.6
1.7 -/* Generic segment creation from program segments. */
1.8 -
1.9 -Segment *ProgramSegment::segment()
1.10 -{
1.11 - return new Segment(
1.12 - region_address(),
1.13 - region_size(),
1.14 - region_flags(),
1.15 - file_offset(),
1.16 - file_contents());
1.17 -}
1.18 -
1.19 -
1.20 -
1.21 /* Program segment construction for 32- or 64-bit variants. */
1.22
1.23 template <typename PROGRAM_HEADER>
1.24 ProgramSegmentVariant<PROGRAM_HEADER>::ProgramSegmentVariant(PROGRAM_HEADER *header)
1.25 : _header(header)
1.26 {
1.27 + init();
1.28 }
1.29
1.30 template <typename PROGRAM_HEADER>
1.31 @@ -94,6 +81,24 @@
1.32
1.33
1.34
1.35 +/* Generic payload destruction. */
1.36 +
1.37 +Payload::~Payload()
1.38 +{
1.39 + if (_segments != NULL)
1.40 + {
1.41 + for (unsigned int i = 0; i < segments(); i++)
1.42 + delete _segments[i];
1.43 + }
1.44 +}
1.45 +
1.46 +unsigned int Payload::segments()
1.47 +{
1.48 + return 0;
1.49 +}
1.50 +
1.51 +
1.52 +
1.53 /* ELF payload construction for 32- or 64-bit variants. */
1.54
1.55 template <typename HEADER, typename PROGRAM_HEADER>
1.56 @@ -127,14 +132,30 @@
1.57 }
1.58
1.59 template <typename HEADER, typename PROGRAM_HEADER>
1.60 -ProgramSegment *PayloadVariant<HEADER, PROGRAM_HEADER>::segment(unsigned int i)
1.61 +Segment *PayloadVariant<HEADER, PROGRAM_HEADER>::segment(unsigned int i)
1.62 {
1.63 if (i >= segments())
1.64 return NULL;
1.65
1.66 - return new ProgramSegmentVariant<PROGRAM_HEADER>(
1.67 - (PROGRAM_HEADER *) ((char *) _header + _header->e_phoff +
1.68 - _header->e_phentsize * i));
1.69 + if (_segments == NULL)
1.70 + {
1.71 + _segments = new Segment *[segments()];
1.72 +
1.73 + for (unsigned int j = 0; j < segments(); j++)
1.74 + _segments[j] = NULL;
1.75 + }
1.76 +
1.77 + Segment *segment = _segments[i];
1.78 +
1.79 + if (segment == NULL)
1.80 + {
1.81 + segment = new ProgramSegmentVariant<PROGRAM_HEADER>(
1.82 + (PROGRAM_HEADER *) ((char *) _header + _header->e_phoff +
1.83 + _header->e_phentsize * i));
1.84 + _segments[i] = segment;
1.85 + }
1.86 +
1.87 + return segment;
1.88 }
1.89
1.90