113 lines
No EOL
1.8 KiB
C
113 lines
No EOL
1.8 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif /* HAVE_CONFIG_H */
|
|
|
|
#include <tcc.h>
|
|
#include <tcc/path.h>
|
|
#include <tcc/memory.h>
|
|
#include <tcc/coff.h>
|
|
|
|
static int
|
|
read_mem(int fd, unsigned offset, void *buffer, unsigned len)
|
|
{
|
|
lseek(fd, offset, SEEK_SET);
|
|
return len == read(fd, buffer, len);
|
|
}
|
|
|
|
int
|
|
coff_load_lib(TCCState *s1, int fd)
|
|
{
|
|
return (0);
|
|
}
|
|
|
|
static int
|
|
coff_merge_or_create(void)
|
|
{
|
|
return (0);
|
|
}
|
|
|
|
static int
|
|
coff_resolve_symbols(void)
|
|
{
|
|
return (0);
|
|
}
|
|
|
|
int
|
|
coff_load_obj(TCCState *s1, int fd)
|
|
{
|
|
FILHDR hdr;
|
|
SCNHDR *scns;
|
|
SYMENT *syments;
|
|
RELOC *relocs;
|
|
Section *s;
|
|
uint16_t i;
|
|
int32_t j;
|
|
int k;
|
|
char buff[9];
|
|
|
|
if (!read_mem(fd, 0, &hdr, FILHSZ))
|
|
return (tcc_error_noabort("not a coff object file"));
|
|
|
|
if (hdr.f_magic != F_MACH_I386 || hdr.f_flags & F_EXEC)
|
|
return (tcc_error_noabort("invalid coff object file"));
|
|
|
|
/* read sections */
|
|
scns = tcc_malloc(SCNHSZ * hdr.f_nscns);
|
|
if (!read_mem(fd, FILHSZ, scns, SCNHSZ * hdr.f_nscns))
|
|
{
|
|
tcc_free(scns);
|
|
return (-1);
|
|
}
|
|
|
|
for (i = 0; i < hdr.f_nscns; i++)
|
|
{
|
|
memset(buff, 0, 9);
|
|
memcpy(buff, scns[i].s_name, 8);
|
|
printf("sec: %s\n", buff);
|
|
|
|
for (k = 1; k < s1->nb_sections; k++)
|
|
{
|
|
if (strcmp(s1->sections[k]->old_name, buff) != 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* load symtab */
|
|
syments = tcc_malloc(SYMESZ * hdr.f_nsyms);
|
|
read_mem(fd, hdr.f_symptr, syments, SYMESZ * hdr.f_nsyms);
|
|
for (j = 0; j < hdr.f_nsyms; j++)
|
|
{
|
|
memset(buff, 0, 9);
|
|
memcpy(buff, syments[j].n_name, 8);
|
|
printf("sym: %s\n", buff);
|
|
}
|
|
|
|
tcc_free(syments);
|
|
tcc_free(scns);
|
|
return (0);
|
|
}
|
|
|
|
int
|
|
coff_load_file(TCCState *s1, int fd, const char *fname)
|
|
{
|
|
if (strcmp(tcc_fileextension(fname), ".a") == 0)
|
|
{
|
|
return (coff_load_lib(s1, fd));
|
|
}
|
|
else
|
|
{
|
|
return (coff_load_obj(s1, fd));
|
|
}
|
|
}
|
|
|
|
int
|
|
coff_output_file(TCCState *s1, const char *filename)
|
|
{
|
|
|
|
return (0);
|
|
} |