mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-18 06:51:47 +00:00
implement -l, but -L isn't supported yet and the full lib name must be given
This commit is contained in:
parent
acf9ce392c
commit
c2a7564d55
6 changed files with 93 additions and 24 deletions
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
void linker_begin (void);
|
void linker_begin (void);
|
||||||
void linker_add_object_file (const char *filename);
|
void linker_add_object_file (const char *filename);
|
||||||
|
void linker_add_lib (const char *libname);
|
||||||
struct qfo_s *linker_finish (void);
|
struct qfo_s *linker_finish (void);
|
||||||
|
|
||||||
#endif//__linker_h
|
#endif//__linker_h
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
#include "QF/pr_comp.h"
|
#include "QF/pr_comp.h"
|
||||||
#include "QF/pr_debug.h"
|
#include "QF/pr_debug.h"
|
||||||
|
#include "QF/vfile.h"
|
||||||
|
|
||||||
#define QFO "QFO"
|
#define QFO "QFO"
|
||||||
#define QFO_VERSION 0x00001004 // MMmmmRRR 0.001.004 (hex)
|
#define QFO_VERSION 0x00001004 // MMmmmRRR 0.001.004 (hex)
|
||||||
|
@ -139,7 +140,8 @@ struct pr_info_s;
|
||||||
|
|
||||||
qfo_t *qfo_from_progs (struct pr_info_s *pr);
|
qfo_t *qfo_from_progs (struct pr_info_s *pr);
|
||||||
int qfo_write (qfo_t *qfo, const char *filename);
|
int qfo_write (qfo_t *qfo, const char *filename);
|
||||||
qfo_t *qfo_read (const char *filename);
|
qfo_t *qfo_read (VFile *file);
|
||||||
|
qfo_t *qfo_open (const char *filename);
|
||||||
int qfo_to_progs (qfo_t *qfo, struct pr_info_s *pr);
|
int qfo_to_progs (qfo_t *qfo, struct pr_info_s *pr);
|
||||||
|
|
||||||
qfo_t *qfo_new (void);
|
qfo_t *qfo_new (void);
|
||||||
|
|
|
@ -39,9 +39,17 @@ static const char rcsid[] =
|
||||||
#ifdef HAVE_STRINGS_H
|
#ifdef HAVE_STRINGS_H
|
||||||
# include <strings.h>
|
# include <strings.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_IO_H
|
||||||
|
# include <io.h>
|
||||||
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "QF/hash.h"
|
#include "QF/hash.h"
|
||||||
|
#include "QF/pakfile.h"
|
||||||
|
|
||||||
#include "def.h"
|
#include "def.h"
|
||||||
#include "emit.h"
|
#include "emit.h"
|
||||||
|
@ -183,7 +191,8 @@ process_def (qfo_def_t *def)
|
||||||
def->flags = d->flags;
|
def->flags = d->flags;
|
||||||
Hash_Add (defined_defs, def);
|
Hash_Add (defined_defs, def);
|
||||||
} else {
|
} else {
|
||||||
Hash_Add (extern_defs, def);
|
if (def->num_relocs)
|
||||||
|
Hash_Add (extern_defs, def);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (def->flags & QFOD_GLOBAL) {
|
if (def->flags & QFOD_GLOBAL) {
|
||||||
|
@ -533,17 +542,8 @@ linker_begin (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
linker_add_object_file (const char *filename)
|
linker_add_qfo (qfo_t *qfo)
|
||||||
{
|
{
|
||||||
qfo_t *qfo;
|
|
||||||
|
|
||||||
qfo = qfo_read (filename);
|
|
||||||
if (!qfo)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (options.verbosity >= 2)
|
|
||||||
puts (filename);
|
|
||||||
|
|
||||||
code_base = code->size;
|
code_base = code->size;
|
||||||
data_base = data->size;
|
data_base = data->size;
|
||||||
far_data_base = far_data->size;
|
far_data_base = far_data->size;
|
||||||
|
@ -561,10 +561,67 @@ linker_add_object_file (const char *filename)
|
||||||
add_funcs (qfo);
|
add_funcs (qfo);
|
||||||
add_defs (qfo);
|
add_defs (qfo);
|
||||||
add_lines (qfo);
|
add_lines (qfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
linker_add_object_file (const char *filename)
|
||||||
|
{
|
||||||
|
qfo_t *qfo;
|
||||||
|
|
||||||
|
qfo = qfo_open (filename);
|
||||||
|
if (!qfo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (options.verbosity >= 2)
|
||||||
|
puts (filename);
|
||||||
|
|
||||||
|
linker_add_qfo (qfo);
|
||||||
|
|
||||||
qfo_delete (qfo);
|
qfo_delete (qfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
linker_add_lib (const char *libname)
|
||||||
|
{
|
||||||
|
pack_t *pack = pack_open (libname);
|
||||||
|
int i, j;
|
||||||
|
int did_something;
|
||||||
|
|
||||||
|
if (!pack)
|
||||||
|
return;
|
||||||
|
do {
|
||||||
|
did_something = 0;
|
||||||
|
for (i = 0; i < pack->numfiles; i++) {
|
||||||
|
int fd;
|
||||||
|
VFile *f;
|
||||||
|
qfo_t *qfo;
|
||||||
|
|
||||||
|
fd = open (libname, O_RDONLY);
|
||||||
|
lseek (fd, pack->files[i].filepos, SEEK_SET);
|
||||||
|
f = Qdopen (fd, "rbz");
|
||||||
|
qfo = qfo_read (f);
|
||||||
|
Qclose (f);
|
||||||
|
close (fd);
|
||||||
|
|
||||||
|
for (j = 0; j < qfo->num_defs; j++) {
|
||||||
|
qfo_def_t *def = qfo->defs + j;
|
||||||
|
if ((def->flags & QFOD_GLOBAL)
|
||||||
|
&& !(def->flags & QFOD_EXTERNAL)
|
||||||
|
&& Hash_Find (extern_defs, qfo->strings + def->name)) {
|
||||||
|
if (options.verbosity >= 2)
|
||||||
|
printf ("adding %s\n", pack->files[i].name);
|
||||||
|
linker_add_qfo (qfo);
|
||||||
|
did_something = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qfo_delete (qfo);
|
||||||
|
}
|
||||||
|
} while (did_something);
|
||||||
|
pack_del (pack);
|
||||||
|
}
|
||||||
|
|
||||||
qfo_t *
|
qfo_t *
|
||||||
linker_finish (void)
|
linker_finish (void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -313,9 +313,8 @@ qfo_write (qfo_t *qfo, const char *filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
qfo_t *
|
qfo_t *
|
||||||
qfo_read (const char *filename)
|
qfo_read (VFile *file)
|
||||||
{
|
{
|
||||||
VFile *file;
|
|
||||||
qfo_header_t hdr;
|
qfo_header_t hdr;
|
||||||
qfo_t *qfo;
|
qfo_t *qfo;
|
||||||
qfo_def_t *def;
|
qfo_def_t *def;
|
||||||
|
@ -325,12 +324,6 @@ qfo_read (const char *filename)
|
||||||
pr_type_t *var;
|
pr_type_t *var;
|
||||||
pr_lineno_t *line;
|
pr_lineno_t *line;
|
||||||
|
|
||||||
file = Qopen (filename, "rbz");
|
|
||||||
if (!file) {
|
|
||||||
perror (filename);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Qread (file, &hdr, sizeof (hdr));
|
Qread (file, &hdr, sizeof (hdr));
|
||||||
|
|
||||||
if (strcmp (hdr.qfo, QFO)) {
|
if (strcmp (hdr.qfo, QFO)) {
|
||||||
|
@ -385,8 +378,6 @@ qfo_read (const char *filename)
|
||||||
Qread (file, qfo->lines, qfo->num_lines * sizeof (pr_lineno_t));
|
Qread (file, qfo->lines, qfo->num_lines * sizeof (pr_lineno_t));
|
||||||
Qread (file, qfo->types, qfo->types_size);
|
Qread (file, qfo->types, qfo->types_size);
|
||||||
|
|
||||||
Qclose (file);
|
|
||||||
|
|
||||||
for (st = qfo->code; st - qfo->code < qfo->code_size; st++) {
|
for (st = qfo->code; st - qfo->code < qfo->code_size; st++) {
|
||||||
st->op = LittleLong (st->op);
|
st->op = LittleLong (st->op);
|
||||||
st->a = LittleLong (st->a);
|
st->a = LittleLong (st->a);
|
||||||
|
@ -439,6 +430,21 @@ qfo_read (const char *filename)
|
||||||
return qfo;
|
return qfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qfo_t *qfo_open (const char *filename)
|
||||||
|
{
|
||||||
|
qfo_t *qfo;
|
||||||
|
VFile *file;
|
||||||
|
|
||||||
|
file = Qopen (filename, "rbz");
|
||||||
|
if (!file) {
|
||||||
|
perror (filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
qfo = qfo_read (file);
|
||||||
|
Qclose (file);
|
||||||
|
return qfo;
|
||||||
|
}
|
||||||
|
|
||||||
defspace_t *
|
defspace_t *
|
||||||
init_space (int size, pr_type_t *data)
|
init_space (int size, pr_type_t *data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -546,7 +546,10 @@ separate_compile (void)
|
||||||
qfo_t *qfo;
|
qfo_t *qfo;
|
||||||
linker_begin ();
|
linker_begin ();
|
||||||
for (file = source_files; *file; file++) {
|
for (file = source_files; *file; file++) {
|
||||||
linker_add_object_file (*file);
|
if (strncmp (*file, "-l", 2))
|
||||||
|
linker_add_object_file (*file);
|
||||||
|
else
|
||||||
|
linker_add_lib (*file + 2);
|
||||||
}
|
}
|
||||||
qfo = linker_finish ();
|
qfo = linker_finish ();
|
||||||
if (qfo) {
|
if (qfo) {
|
||||||
|
|
|
@ -182,7 +182,7 @@ main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (optind < argc) {
|
while (optind < argc) {
|
||||||
qfo = qfo_read (argv[optind++]);
|
qfo = qfo_open (argv[optind++]);
|
||||||
if (!qfo)
|
if (!qfo)
|
||||||
return 1;
|
return 1;
|
||||||
dump_defs (qfo);
|
dump_defs (qfo);
|
||||||
|
|
Loading…
Reference in a new issue