#include "section.h"
#include "write7x.h"
+#define IMAGE_SYM_ABSOLUTE -1
+#define IMAGE_SYM_DEBUG -2
+
+#define IMAGE_SYM_UNDEFINED 0
+#define IMAGE_SYM_CLASS_EXTERNAL 2
+#define IMAGE_SYM_CLASS_STATIC 3
+
struct string_table_header {
unsigned char StringTableSize[4];
};
unsigned char SectionNumber[2];
unsigned char Type[2];
- unsigned char StorageClass;
- unsigned char NumberOfAuxSymbols;
+ unsigned char StorageClass[1];
+ unsigned char NumberOfAuxSymbols[1];
};
exit (EXIT_FAILURE);
}
+
+ if (reloc->symbol->section_number == IMAGE_SYM_CLASS_STATIC) {
+ reloc->n_type = reloc->symbol->section_number;
+ }
}
}
-#define IMAGE_SYM_ABSOLUTE -1
-#define IMAGE_SYM_DEBUG -2
-
-#define IMAGE_SYM_UNDEFINED 0
-#define IMAGE_SYM_CLASS_EXTERNAL 2
-
void read_coff_object (const char *filename, unsigned char *data, unsigned long data_size) {
struct coff_header *coff_hdr;
part_p_array[i + 1] = part;
}
+
no_syms = array_to_integer (coff_hdr->NumberOfSymbols, 4);
for (i = 0; i < no_syms; i++) {
}
- if (coff_symbol->StorageClass == IMAGE_SYM_CLASS_EXTERNAL || section_no == IMAGE_SYM_UNDEFINED) {
+ if (coff_symbol->StorageClass[0] == IMAGE_SYM_CLASS_STATIC) {
+ symbol->n_type = 2;
+ }
+
+ if (coff_symbol->StorageClass[0] == IMAGE_SYM_CLASS_EXTERNAL || section_no == IMAGE_SYM_UNDEFINED) {
symbol_record_external_symbol (symbol);
}
- if (coff_symbol->NumberOfAuxSymbols) {
+ if (coff_symbol->NumberOfAuxSymbols[0]) {
unsigned long j;
- for (j = 0; j < coff_symbol->NumberOfAuxSymbols; j++) {
+ for (j = 0; j < coff_symbol->NumberOfAuxSymbols[0]; j++) {
symbol = of->symbol_arr + i + 1 + j;
}
- i += coff_symbol->NumberOfAuxSymbols;
+ i += coff_symbol->NumberOfAuxSymbols[1];
}
if (state->format == LD_FORMAT_BIN || state->format == LD_FORMAT_COM) {
- if (!rel->n_ext/* || (symbol->n_type & N_TYPE) == N_BSS || (symbol->n_type & N_TYPE) == N_DATA || (symbol->n_type & N_TYPE) == N_TEXT*/) {
+ if (symbol->section_number != ABSOLUTE_SECTION_NUMBER && !rel->n_ext) {
- /*report_at (__FILE__, __LINE__, REPORT_FATAL_ERROR, "symbol: %s, %lx", symbol->name, ((rel->symbolnum) >> 28));*/
-
- if (rel->n_type != 2) {
- report_at (program_name, 0, REPORT_ERROR, "%s:(%s+%#lu): segment relocation", part->of->filename, part->section->name, offset);
+ if (rel->n_type != 2 && symbol->n_type != 2) {
+ report_at (program_name, 0, REPORT_ERROR, "%s:(%s+%#lu): segment relocation");
}
}
unsigned long offset = 0, offset2 = 0, offset3 = 0;
int bHeaderName;
- FILE *outfile;
unsigned long pad_length, pad[2];
+ FILE *outfile;
- struct data_entry data_entry;
- struct data_descriptor data_descriptor;
- struct section_descriptor_long section_descriptor_long;
struct section_descriptor_short section_descriptor_short;
+ struct section_descriptor_long section_descriptor_long;
+
+ struct data_descriptor data_descriptor;
+ struct data_entry data_entry;
info_list = create_symbol_list (export_names, num_names);
}
- offset += write_data (outfile, "!<arch>\n", 8);
-
- offsets[0] = offset;
+ offsets[0] = (offset += write_data (outfile, "!<arch>\n", 8));
fseek (outfile, sizeof (struct ar_header), SEEK_CUR);
offset2 = ftell (outfile);