many improvements
This commit is contained in:
parent
6ba5c0b850
commit
56c0f3bc5b
|
@ -132,7 +132,7 @@ main(argc, argv)
|
||||||
if (! rd_open(argv[1]))
|
if (! rd_open(argv[1]))
|
||||||
fatal("Can't read %s.\n", argv[1]);
|
fatal("Can't read %s.\n", argv[1]);
|
||||||
break;
|
break;
|
||||||
default:fatal("Usage: %s <ACK object> <Sun object>.\n", argv[0]);
|
default:fatal("Usage: %s [-u] <ACK object> <Sun object>.\n", argv[0]);
|
||||||
}
|
}
|
||||||
rd_ohead(&outhead);
|
rd_ohead(&outhead);
|
||||||
if (BADMAGIC(outhead))
|
if (BADMAGIC(outhead))
|
||||||
|
@ -481,6 +481,18 @@ cvshort(s)
|
||||||
*p = x;
|
*p = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
is_rest_local(A, i)
|
||||||
|
register int i;
|
||||||
|
register struct outname *A;
|
||||||
|
{
|
||||||
|
while (i--) {
|
||||||
|
if (A->on_type & S_EXT) return 0;
|
||||||
|
A++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
emit_symtab()
|
emit_symtab()
|
||||||
{
|
{
|
||||||
register unsigned short i = outhead.oh_nname;
|
register unsigned short i = outhead.oh_nname;
|
||||||
|
@ -503,8 +515,16 @@ emit_symtab()
|
||||||
}
|
}
|
||||||
MACHnames = M;
|
MACHnames = M;
|
||||||
ACKnames = A;
|
ACKnames = A;
|
||||||
for (; i; i--, A++, M++) {
|
for (; i; i--, A++) {
|
||||||
M->value = A->on_valu;
|
M->value = A->on_valu;
|
||||||
|
if (A->on_type & S_SCT ||
|
||||||
|
(A->on_type & S_ETC) == S_FIL) {
|
||||||
|
static int rest_local;
|
||||||
|
if (! unresolved || rest_local || (rest_local = is_rest_local(A, i))) {
|
||||||
|
outhead.oh_nname--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (A->on_type & S_COM) {
|
if (A->on_type & S_COM) {
|
||||||
M->type = N_UNDF | N_EXT;
|
M->type = N_UNDF | N_EXT;
|
||||||
}
|
}
|
||||||
|
@ -515,7 +535,6 @@ emit_symtab()
|
||||||
M->type = N_UNDF;
|
M->type = N_UNDF;
|
||||||
break;
|
break;
|
||||||
case S_MOD:
|
case S_MOD:
|
||||||
case S_FIL:
|
|
||||||
M->type = N_FN;
|
M->type = N_FN;
|
||||||
break;
|
break;
|
||||||
case S_LIN:
|
case S_LIN:
|
||||||
|
@ -530,12 +549,24 @@ emit_symtab()
|
||||||
M->type = N_TEXT;
|
M->type = N_TEXT;
|
||||||
break;
|
break;
|
||||||
case S_MIN + ROMSG:
|
case S_MIN + ROMSG:
|
||||||
|
if (unresolved) {
|
||||||
|
M->value += outsect[TEXTSG].os_size;
|
||||||
|
}
|
||||||
M->type = (rom_in_data ? N_DATA : N_TEXT);
|
M->type = (rom_in_data ? N_DATA : N_TEXT);
|
||||||
break;
|
break;
|
||||||
case S_MIN + DATASG:
|
case S_MIN + DATASG:
|
||||||
|
if (unresolved) {
|
||||||
|
M->value += outsect[TEXTSG].os_size +
|
||||||
|
outsect[ROMSG].os_size;
|
||||||
|
}
|
||||||
M->type = N_DATA;
|
M->type = N_DATA;
|
||||||
break;
|
break;
|
||||||
case S_MIN + BSSSG:
|
case S_MIN + BSSSG:
|
||||||
|
if (unresolved) {
|
||||||
|
M->value += outsect[TEXTSG].os_size +
|
||||||
|
outsect[ROMSG].os_size +
|
||||||
|
outsect[DATASG].os_size;
|
||||||
|
}
|
||||||
M->type = N_BSS;
|
M->type = N_BSS;
|
||||||
break;
|
break;
|
||||||
case S_MIN + LSECT:
|
case S_MIN + LSECT:
|
||||||
|
@ -546,7 +577,12 @@ emit_symtab()
|
||||||
A->on_type & S_TYP);
|
A->on_type & S_TYP);
|
||||||
}
|
}
|
||||||
if (A->on_type & S_EXT) M->type |= N_EXT;
|
if (A->on_type & S_EXT) M->type |= N_EXT;
|
||||||
if (M->name = A->on_foff) {
|
M->name = A->on_foff;
|
||||||
|
M++;
|
||||||
|
}
|
||||||
|
M = MACHnames;
|
||||||
|
for (i = outhead.oh_nname; i; i--, M++) {
|
||||||
|
if (M->name) {
|
||||||
M->name -= offX;
|
M->name -= offX;
|
||||||
}
|
}
|
||||||
else M->name = outhead.oh_nchar + 3; /* pointer to nullbyte */
|
else M->name = outhead.oh_nchar + 3; /* pointer to nullbyte */
|
||||||
|
|
|
@ -132,7 +132,7 @@ main(argc, argv)
|
||||||
if (! rd_open(argv[1]))
|
if (! rd_open(argv[1]))
|
||||||
fatal("Can't read %s.\n", argv[1]);
|
fatal("Can't read %s.\n", argv[1]);
|
||||||
break;
|
break;
|
||||||
default:fatal("Usage: %s <ACK object> <Sun object>.\n", argv[0]);
|
default:fatal("Usage: %s [-u] <ACK object> <Sun object>.\n", argv[0]);
|
||||||
}
|
}
|
||||||
rd_ohead(&outhead);
|
rd_ohead(&outhead);
|
||||||
if (BADMAGIC(outhead))
|
if (BADMAGIC(outhead))
|
||||||
|
@ -481,6 +481,18 @@ cvshort(s)
|
||||||
*p = x;
|
*p = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
is_rest_local(A, i)
|
||||||
|
register int i;
|
||||||
|
register struct outname *A;
|
||||||
|
{
|
||||||
|
while (i--) {
|
||||||
|
if (A->on_type & S_EXT) return 0;
|
||||||
|
A++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
emit_symtab()
|
emit_symtab()
|
||||||
{
|
{
|
||||||
register unsigned short i = outhead.oh_nname;
|
register unsigned short i = outhead.oh_nname;
|
||||||
|
@ -503,8 +515,16 @@ emit_symtab()
|
||||||
}
|
}
|
||||||
MACHnames = M;
|
MACHnames = M;
|
||||||
ACKnames = A;
|
ACKnames = A;
|
||||||
for (; i; i--, A++, M++) {
|
for (; i; i--, A++) {
|
||||||
M->value = A->on_valu;
|
M->value = A->on_valu;
|
||||||
|
if (A->on_type & S_SCT ||
|
||||||
|
(A->on_type & S_ETC) == S_FIL) {
|
||||||
|
static int rest_local;
|
||||||
|
if (! unresolved || rest_local || (rest_local = is_rest_local(A, i))) {
|
||||||
|
outhead.oh_nname--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (A->on_type & S_COM) {
|
if (A->on_type & S_COM) {
|
||||||
M->type = N_UNDF | N_EXT;
|
M->type = N_UNDF | N_EXT;
|
||||||
}
|
}
|
||||||
|
@ -515,7 +535,6 @@ emit_symtab()
|
||||||
M->type = N_UNDF;
|
M->type = N_UNDF;
|
||||||
break;
|
break;
|
||||||
case S_MOD:
|
case S_MOD:
|
||||||
case S_FIL:
|
|
||||||
M->type = N_FN;
|
M->type = N_FN;
|
||||||
break;
|
break;
|
||||||
case S_LIN:
|
case S_LIN:
|
||||||
|
@ -530,12 +549,24 @@ emit_symtab()
|
||||||
M->type = N_TEXT;
|
M->type = N_TEXT;
|
||||||
break;
|
break;
|
||||||
case S_MIN + ROMSG:
|
case S_MIN + ROMSG:
|
||||||
|
if (unresolved) {
|
||||||
|
M->value += outsect[TEXTSG].os_size;
|
||||||
|
}
|
||||||
M->type = (rom_in_data ? N_DATA : N_TEXT);
|
M->type = (rom_in_data ? N_DATA : N_TEXT);
|
||||||
break;
|
break;
|
||||||
case S_MIN + DATASG:
|
case S_MIN + DATASG:
|
||||||
|
if (unresolved) {
|
||||||
|
M->value += outsect[TEXTSG].os_size +
|
||||||
|
outsect[ROMSG].os_size;
|
||||||
|
}
|
||||||
M->type = N_DATA;
|
M->type = N_DATA;
|
||||||
break;
|
break;
|
||||||
case S_MIN + BSSSG:
|
case S_MIN + BSSSG:
|
||||||
|
if (unresolved) {
|
||||||
|
M->value += outsect[TEXTSG].os_size +
|
||||||
|
outsect[ROMSG].os_size +
|
||||||
|
outsect[DATASG].os_size;
|
||||||
|
}
|
||||||
M->type = N_BSS;
|
M->type = N_BSS;
|
||||||
break;
|
break;
|
||||||
case S_MIN + LSECT:
|
case S_MIN + LSECT:
|
||||||
|
@ -546,7 +577,12 @@ emit_symtab()
|
||||||
A->on_type & S_TYP);
|
A->on_type & S_TYP);
|
||||||
}
|
}
|
||||||
if (A->on_type & S_EXT) M->type |= N_EXT;
|
if (A->on_type & S_EXT) M->type |= N_EXT;
|
||||||
if (M->name = A->on_foff) {
|
M->name = A->on_foff;
|
||||||
|
M++;
|
||||||
|
}
|
||||||
|
M = MACHnames;
|
||||||
|
for (i = outhead.oh_nname; i; i--, M++) {
|
||||||
|
if (M->name) {
|
||||||
M->name -= offX;
|
M->name -= offX;
|
||||||
}
|
}
|
||||||
else M->name = outhead.oh_nchar + 3; /* pointer to nullbyte */
|
else M->name = outhead.oh_nchar + 3; /* pointer to nullbyte */
|
||||||
|
|
Loading…
Reference in a new issue