00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "bfd.h"
00031 #include "sysdep.h"
00032 #include "libbfd.h"
00033
00034 #define ARCH_SIZE 32
00035
00036 #include "nlm/alpha-ext.h"
00037 #define Nlm_External_Fixed_Header Nlm32_alpha_External_Fixed_Header
00038
00039 #include "libnlm.h"
00040
00041 static bfd_boolean nlm_alpha_backend_object_p
00042 PARAMS ((bfd *));
00043 static bfd_boolean nlm_alpha_write_prefix
00044 PARAMS ((bfd *));
00045 static bfd_boolean nlm_alpha_read_reloc
00046 PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *));
00047 static bfd_boolean nlm_alpha_mangle_relocs
00048 PARAMS ((bfd *, asection *, const PTR, bfd_vma, bfd_size_type));
00049 static bfd_boolean nlm_alpha_read_import
00050 PARAMS ((bfd *, nlmNAME(symbol_type) *));
00051 static bfd_boolean nlm_alpha_write_import
00052 PARAMS ((bfd *, asection *, arelent *));
00053 static bfd_boolean nlm_alpha_set_public_section
00054 PARAMS ((bfd *, nlmNAME(symbol_type) *));
00055 static bfd_vma nlm_alpha_get_public_offset
00056 PARAMS ((bfd *, asymbol *));
00057 static bfd_boolean nlm_alpha_write_external
00058 PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *));
00059
00060
00061
00062
00063
00064 static bfd_boolean
00065 nlm_alpha_backend_object_p (abfd)
00066 bfd *abfd;
00067 {
00068 struct nlm32_alpha_external_prefix_header s;
00069 file_ptr size;
00070
00071 if (bfd_bread ((PTR) &s, (bfd_size_type) sizeof s, abfd) != sizeof s)
00072 return FALSE;
00073
00074 if (H_GET_32 (abfd, s.magic) != NLM32_ALPHA_MAGIC)
00075 return FALSE;
00076
00077
00078
00079
00080 size = H_GET_32 (abfd, s.size);
00081 if (bfd_seek (abfd, size, SEEK_SET) != 0)
00082 return FALSE;
00083
00084 return TRUE;
00085 }
00086
00087
00088
00089 static bfd_boolean
00090 nlm_alpha_write_prefix (abfd)
00091 bfd *abfd;
00092 {
00093 struct nlm32_alpha_external_prefix_header s;
00094
00095 memset (&s, 0, sizeof s);
00096 H_PUT_32 (abfd, NLM32_ALPHA_MAGIC, s.magic);
00097 H_PUT_32 (abfd, 2, s.format);
00098 H_PUT_32 (abfd, sizeof s, s.size);
00099 if (bfd_bwrite ((PTR) &s, (bfd_size_type) sizeof s, abfd) != sizeof s)
00100 return FALSE;
00101 return TRUE;
00102 }
00103
00104 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
00105
00106
00107
00108 static reloc_howto_type nlm32_alpha_howto_table[] =
00109 {
00110
00111
00112
00113 HOWTO (ALPHA_R_IGNORE,
00114 0,
00115 0,
00116 8,
00117 FALSE,
00118 0,
00119 complain_overflow_dont,
00120 0,
00121 "IGNORE",
00122 FALSE,
00123 0,
00124 0,
00125 FALSE),
00126
00127
00128 HOWTO (ALPHA_R_REFLONG,
00129 0,
00130 2,
00131 32,
00132 FALSE,
00133 0,
00134 complain_overflow_bitfield,
00135 0,
00136 "REFLONG",
00137 TRUE,
00138 0xffffffff,
00139 0xffffffff,
00140 FALSE),
00141
00142
00143 HOWTO (ALPHA_R_REFQUAD,
00144 0,
00145 4,
00146 64,
00147 FALSE,
00148 0,
00149 complain_overflow_bitfield,
00150 0,
00151 "REFQUAD",
00152 TRUE,
00153 ONES (64),
00154 ONES (64),
00155 FALSE),
00156
00157
00158
00159
00160 HOWTO (ALPHA_R_GPREL32,
00161 0,
00162 2,
00163 32,
00164 FALSE,
00165 0,
00166 complain_overflow_bitfield,
00167 0,
00168 "GPREL32",
00169 TRUE,
00170 0xffffffff,
00171 0xffffffff,
00172 FALSE),
00173
00174
00175
00176
00177 HOWTO (ALPHA_R_LITERAL,
00178 0,
00179 2,
00180 16,
00181 FALSE,
00182 0,
00183 complain_overflow_signed,
00184 0,
00185 "LITERAL",
00186 TRUE,
00187 0xffff,
00188 0xffff,
00189 FALSE),
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 HOWTO (ALPHA_R_LITUSE,
00201 0,
00202 2,
00203 32,
00204 FALSE,
00205 0,
00206 complain_overflow_dont,
00207 0,
00208 "LITUSE",
00209 FALSE,
00210 0,
00211 0,
00212 FALSE),
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 HOWTO (ALPHA_R_GPDISP,
00226 16,
00227 2,
00228 16,
00229 TRUE,
00230 0,
00231 complain_overflow_dont,
00232 0,
00233 "GPDISP",
00234 TRUE,
00235 0xffff,
00236 0xffff,
00237 TRUE),
00238
00239
00240
00241
00242
00243 HOWTO (ALPHA_R_BRADDR,
00244 2,
00245 2,
00246 21,
00247 TRUE,
00248 0,
00249 complain_overflow_signed,
00250 0,
00251 "BRADDR",
00252 FALSE,
00253 0,
00254 0x1fffff,
00255 FALSE),
00256
00257
00258 HOWTO (ALPHA_R_HINT,
00259 2,
00260 2,
00261 14,
00262 FALSE,
00263 0,
00264 complain_overflow_dont,
00265 0,
00266 "HINT",
00267 TRUE,
00268 0x3fff,
00269 0x3fff,
00270 FALSE),
00271
00272
00273 HOWTO (ALPHA_R_SREL16,
00274 0,
00275 1,
00276 16,
00277 TRUE,
00278 0,
00279 complain_overflow_signed,
00280 0,
00281 "SREL16",
00282 TRUE,
00283 0xffff,
00284 0xffff,
00285 FALSE),
00286
00287
00288 HOWTO (ALPHA_R_SREL32,
00289 0,
00290 2,
00291 32,
00292 TRUE,
00293 0,
00294 complain_overflow_signed,
00295 0,
00296 "SREL32",
00297 TRUE,
00298 0xffffffff,
00299 0xffffffff,
00300 FALSE),
00301
00302
00303 HOWTO (ALPHA_R_SREL64,
00304 0,
00305 4,
00306 64,
00307 TRUE,
00308 0,
00309 complain_overflow_signed,
00310 0,
00311 "SREL64",
00312 TRUE,
00313 ONES (64),
00314 ONES (64),
00315 FALSE),
00316
00317
00318 HOWTO (ALPHA_R_OP_PUSH,
00319 0,
00320 0,
00321 0,
00322 FALSE,
00323 0,
00324 complain_overflow_dont,
00325 0,
00326 "OP_PUSH",
00327 FALSE,
00328 0,
00329 0,
00330 FALSE),
00331
00332
00333
00334 HOWTO (ALPHA_R_OP_STORE,
00335 0,
00336 4,
00337 64,
00338 FALSE,
00339 0,
00340 complain_overflow_dont,
00341 0,
00342 "OP_STORE",
00343 FALSE,
00344 0,
00345 ONES (64),
00346 FALSE),
00347
00348
00349
00350 HOWTO (ALPHA_R_OP_PSUB,
00351 0,
00352 0,
00353 0,
00354 FALSE,
00355 0,
00356 complain_overflow_dont,
00357 0,
00358 "OP_PSUB",
00359 FALSE,
00360 0,
00361 0,
00362 FALSE),
00363
00364
00365
00366 HOWTO (ALPHA_R_OP_PRSHIFT,
00367 0,
00368 0,
00369 0,
00370 FALSE,
00371 0,
00372 complain_overflow_dont,
00373 0,
00374 "OP_PRSHIFT",
00375 FALSE,
00376 0,
00377 0,
00378 FALSE),
00379
00380
00381 HOWTO (ALPHA_R_GPVALUE,
00382 0,
00383 0,
00384 0,
00385 FALSE,
00386 0,
00387 complain_overflow_dont,
00388 0,
00389 "GPVALUE",
00390 FALSE,
00391 0,
00392 0,
00393 FALSE)
00394 };
00395
00396 static reloc_howto_type nlm32_alpha_nw_howto =
00397 HOWTO (ALPHA_R_NW_RELOC,
00398 0,
00399 0,
00400 0,
00401 FALSE,
00402 0,
00403 complain_overflow_dont,
00404 0,
00405 "NW_RELOC",
00406 FALSE,
00407 0,
00408 0,
00409 FALSE);
00410
00411
00412
00413
00414
00415 static bfd_boolean
00416 nlm_alpha_read_reloc (abfd, sym, secp, rel)
00417 bfd *abfd;
00418 nlmNAME(symbol_type) *sym;
00419 asection **secp;
00420 arelent *rel;
00421 {
00422 static bfd_vma gp_value;
00423 static bfd_vma lita_address;
00424 struct nlm32_alpha_external_reloc ext;
00425 bfd_vma r_vaddr;
00426 long r_symndx;
00427 int r_type, r_extern, r_offset, r_size;
00428 asection *code_sec, *data_sec;
00429
00430
00431 if (bfd_bread (&ext, (bfd_size_type) sizeof ext, abfd) != sizeof ext)
00432 return FALSE;
00433
00434
00435 r_vaddr = H_GET_64 (abfd, ext.r_vaddr);
00436 r_symndx = H_GET_32 (abfd, ext.r_symndx);
00437
00438 BFD_ASSERT (bfd_little_endian (abfd));
00439
00440 r_type = ((ext.r_bits[0] & RELOC_BITS0_TYPE_LITTLE)
00441 >> RELOC_BITS0_TYPE_SH_LITTLE);
00442 r_extern = (ext.r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;
00443 r_offset = ((ext.r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)
00444 >> RELOC_BITS1_OFFSET_SH_LITTLE);
00445
00446 r_size = ((ext.r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
00447 >> RELOC_BITS3_SIZE_SH_LITTLE);
00448
00449
00450 code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);
00451 data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);
00452 if (r_extern)
00453 {
00454
00455 BFD_ASSERT (sym != NULL);
00456
00457
00458 rel->sym_ptr_ptr = NULL;
00459 rel->addend = 0;
00460 }
00461 else
00462 {
00463
00464
00465
00466 BFD_ASSERT (r_type == ALPHA_R_NW_RELOC || sym == NULL);
00467 if (r_type == ALPHA_R_NW_RELOC
00468 || r_type == ALPHA_R_GPDISP
00469 || r_type == ALPHA_R_IGNORE)
00470 {
00471 rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
00472 rel->addend = 0;
00473 }
00474 else if (r_symndx == ALPHA_RELOC_SECTION_TEXT)
00475 {
00476 rel->sym_ptr_ptr = code_sec->symbol_ptr_ptr;
00477 BFD_ASSERT (bfd_get_section_vma (abfd, code_sec) == 0);
00478 rel->addend = 0;
00479 }
00480 else if (r_symndx == ALPHA_RELOC_SECTION_DATA)
00481 {
00482 rel->sym_ptr_ptr = data_sec->symbol_ptr_ptr;
00483 rel->addend = - bfd_get_section_vma (abfd, data_sec);
00484 }
00485 else
00486 {
00487 BFD_ASSERT (0);
00488 rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
00489 rel->addend = 0;
00490 }
00491 }
00492
00493
00494
00495
00496 if (r_type == ALPHA_R_NW_RELOC
00497 || r_vaddr < code_sec->size)
00498 {
00499 *secp = code_sec;
00500 rel->address = r_vaddr;
00501 }
00502 else
00503 {
00504 *secp = data_sec;
00505 rel->address = r_vaddr - code_sec->size;
00506 }
00507
00508
00509 BFD_ASSERT ((r_type >= 0 && r_type <= ALPHA_R_GPVALUE)
00510 || r_type == ALPHA_R_NW_RELOC);
00511
00512 switch (r_type)
00513 {
00514 case ALPHA_R_BRADDR:
00515 case ALPHA_R_SREL16:
00516 case ALPHA_R_SREL32:
00517 case ALPHA_R_SREL64:
00518
00519
00520 rel->addend = 0;
00521 break;
00522
00523 case ALPHA_R_GPREL32:
00524
00525
00526 if (! r_extern)
00527 rel->addend += gp_value;
00528 break;
00529
00530 case ALPHA_R_LITERAL:
00531 BFD_ASSERT (! r_extern);
00532 rel->addend += lita_address;
00533 break;
00534
00535 case ALPHA_R_LITUSE:
00536 case ALPHA_R_GPDISP:
00537
00538
00539
00540 rel->addend = r_symndx;
00541 rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
00542 break;
00543
00544 case ALPHA_R_OP_STORE:
00545
00546
00547 BFD_ASSERT (r_offset < 256 && r_size < 256);
00548 rel->addend = (r_offset << 8) + r_size;
00549 break;
00550
00551 case ALPHA_R_OP_PUSH:
00552 case ALPHA_R_OP_PSUB:
00553 case ALPHA_R_OP_PRSHIFT:
00554
00555
00556
00557 rel->addend = r_vaddr;
00558 break;
00559
00560 case ALPHA_R_GPVALUE:
00561
00562 gp_value += r_symndx;
00563 rel->addend = gp_value;
00564 break;
00565
00566 case ALPHA_R_IGNORE:
00567
00568
00569
00570
00571
00572 rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
00573 rel->address = r_vaddr;
00574 rel->addend = gp_value;
00575 break;
00576
00577 case ALPHA_R_NW_RELOC:
00578
00579
00580
00581
00582 if (r_size == ALPHA_R_NW_RELOC_SETGP)
00583 {
00584 gp_value = r_vaddr;
00585 rel->addend = 0;
00586 }
00587 else if (r_size == ALPHA_R_NW_RELOC_LITA)
00588 {
00589 lita_address = r_vaddr;
00590 rel->addend = r_symndx + 1;
00591 }
00592 else
00593 BFD_ASSERT (0);
00594 rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
00595 break;
00596
00597 default:
00598 break;
00599 }
00600
00601 if (r_type == ALPHA_R_NW_RELOC)
00602 rel->howto = &nlm32_alpha_nw_howto;
00603 else
00604 rel->howto = &nlm32_alpha_howto_table[r_type];
00605
00606 return TRUE;
00607 }
00608
00609
00610
00611 static bfd_boolean
00612 nlm_alpha_mangle_relocs (abfd, sec, data, offset, count)
00613 bfd *abfd ATTRIBUTE_UNUSED;
00614 asection *sec ATTRIBUTE_UNUSED;
00615 const PTR data ATTRIBUTE_UNUSED;
00616 bfd_vma offset ATTRIBUTE_UNUSED;
00617 bfd_size_type count ATTRIBUTE_UNUSED;
00618 {
00619 return TRUE;
00620 }
00621
00622
00623
00624 static bfd_boolean
00625 nlm_alpha_read_import (abfd, sym)
00626 bfd *abfd;
00627 nlmNAME(symbol_type) *sym;
00628 {
00629 struct nlm_relent *nlm_relocs;
00630 bfd_size_type rcount;
00631 bfd_byte temp[NLM_TARGET_LONG_SIZE];
00632 unsigned char symlength;
00633 char *name;
00634 bfd_size_type amt;
00635
00636 if (bfd_bread ((PTR) &symlength, (bfd_size_type) sizeof (symlength), abfd)
00637 != sizeof (symlength))
00638 return FALSE;
00639 sym -> symbol.the_bfd = abfd;
00640 name = bfd_alloc (abfd, (bfd_size_type) symlength + 1);
00641 if (name == NULL)
00642 return FALSE;
00643 if (bfd_bread (name, (bfd_size_type) symlength, abfd) != symlength)
00644 return FALSE;
00645 name[symlength] = '\0';
00646 sym -> symbol.name = name;
00647 sym -> symbol.flags = 0;
00648 sym -> symbol.value = 0;
00649 sym -> symbol.section = bfd_und_section_ptr;
00650 if (bfd_bread ((PTR) temp, (bfd_size_type) sizeof (temp), abfd)
00651 != sizeof (temp))
00652 return FALSE;
00653 rcount = H_GET_32 (abfd, temp);
00654 amt = rcount * sizeof (struct nlm_relent);
00655 nlm_relocs = (struct nlm_relent *) bfd_alloc (abfd, amt);
00656 if (!nlm_relocs)
00657 return FALSE;
00658 sym -> relocs = nlm_relocs;
00659 sym -> rcnt = 0;
00660 while (sym -> rcnt < rcount)
00661 {
00662 asection *section;
00663
00664 if (! nlm_alpha_read_reloc (abfd, sym, §ion, &nlm_relocs -> reloc))
00665 return FALSE;
00666 nlm_relocs -> section = section;
00667 nlm_relocs++;
00668 sym -> rcnt++;
00669 }
00670
00671 return TRUE;
00672 }
00673
00674
00675
00676 static bfd_boolean
00677 nlm_alpha_write_import (abfd, sec, rel)
00678 bfd *abfd;
00679 asection *sec;
00680 arelent *rel;
00681 {
00682 asymbol *sym;
00683 bfd_vma r_vaddr;
00684 long r_symndx;
00685 int r_type, r_extern, r_offset, r_size;
00686 struct nlm32_alpha_external_reloc ext;
00687
00688 sym = *rel->sym_ptr_ptr;
00689
00690
00691 r_type = rel->howto->type;
00692 if (r_type != ALPHA_R_NW_RELOC)
00693 {
00694 r_vaddr = bfd_get_section_vma (abfd, sec) + rel->address;
00695 if ((sec->flags & SEC_CODE) == 0)
00696 r_vaddr += bfd_get_section_by_name (abfd, NLM_CODE_NAME) -> size;
00697 if (bfd_is_und_section (bfd_get_section (sym)))
00698 {
00699 r_extern = 1;
00700 r_symndx = 0;
00701 }
00702 else
00703 {
00704 r_extern = 0;
00705 if (bfd_get_section_flags (abfd, bfd_get_section (sym)) & SEC_CODE)
00706 r_symndx = ALPHA_RELOC_SECTION_TEXT;
00707 else
00708 r_symndx = ALPHA_RELOC_SECTION_DATA;
00709 }
00710 r_offset = 0;
00711 r_size = 0;
00712
00713 switch (r_type)
00714 {
00715 case ALPHA_R_LITUSE:
00716 case ALPHA_R_GPDISP:
00717 r_symndx = rel->addend;
00718 break;
00719
00720 case ALPHA_R_OP_STORE:
00721 r_size = rel->addend & 0xff;
00722 r_offset = (rel->addend >> 8) & 0xff;
00723 break;
00724
00725 case ALPHA_R_OP_PUSH:
00726 case ALPHA_R_OP_PSUB:
00727 case ALPHA_R_OP_PRSHIFT:
00728 r_vaddr = rel->addend;
00729 break;
00730
00731 case ALPHA_R_IGNORE:
00732 r_vaddr = rel->address;
00733 break;
00734
00735 default:
00736 break;
00737 }
00738 }
00739 else
00740 {
00741
00742 r_vaddr = rel->address;
00743 if (rel->addend == 0)
00744 {
00745 r_symndx = 0;
00746 r_size = ALPHA_R_NW_RELOC_SETGP;
00747 }
00748 else
00749 {
00750 r_symndx = rel->addend - 1;
00751 r_size = ALPHA_R_NW_RELOC_LITA;
00752 }
00753 r_extern = 0;
00754 r_offset = 0;
00755 }
00756
00757
00758 H_PUT_64 (abfd, r_vaddr, ext.r_vaddr);
00759 H_PUT_32 (abfd, r_symndx, ext.r_symndx);
00760
00761 BFD_ASSERT (bfd_little_endian (abfd));
00762
00763 ext.r_bits[0] = ((r_type << RELOC_BITS0_TYPE_SH_LITTLE)
00764 & RELOC_BITS0_TYPE_LITTLE);
00765 ext.r_bits[1] = ((r_extern ? RELOC_BITS1_EXTERN_LITTLE : 0)
00766 | ((r_offset << RELOC_BITS1_OFFSET_SH_LITTLE)
00767 & RELOC_BITS1_OFFSET_LITTLE));
00768 ext.r_bits[2] = 0;
00769 ext.r_bits[3] = ((r_size << RELOC_BITS3_SIZE_SH_LITTLE)
00770 & RELOC_BITS3_SIZE_LITTLE);
00771
00772
00773 if (bfd_bwrite (&ext, (bfd_size_type) sizeof ext, abfd) != sizeof ext)
00774 return FALSE;
00775
00776 return TRUE;
00777 }
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787 static bfd_boolean
00788 nlm_alpha_set_public_section (abfd, sym)
00789 bfd *abfd;
00790 nlmNAME(symbol_type) *sym;
00791 {
00792 asection *code_sec, *data_sec;
00793
00794 code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);
00795 data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);
00796 if (sym->symbol.value < code_sec->size)
00797 {
00798 sym->symbol.section = code_sec;
00799 sym->symbol.flags |= BSF_FUNCTION;
00800 }
00801 else
00802 {
00803 sym->symbol.section = data_sec;
00804 sym->symbol.value -= code_sec->size;
00805
00806 BFD_ASSERT ((code_sec->size & 0xf) == 0);
00807 }
00808 return TRUE;
00809 }
00810
00811
00812
00813 static bfd_vma
00814 nlm_alpha_get_public_offset (abfd, sym)
00815 bfd *abfd ATTRIBUTE_UNUSED;
00816 asymbol *sym;
00817 {
00818 return bfd_asymbol_value (sym);
00819 }
00820
00821
00822
00823 static bfd_boolean
00824 nlm_alpha_write_external (abfd, count, sym, relocs)
00825 bfd *abfd;
00826 bfd_size_type count;
00827 asymbol *sym;
00828 struct reloc_and_sec *relocs;
00829 {
00830 bfd_size_type i;
00831 bfd_byte len;
00832 unsigned char temp[NLM_TARGET_LONG_SIZE];
00833 arelent r;
00834
00835 len = strlen (sym->name);
00836 if ((bfd_bwrite (&len, (bfd_size_type) sizeof (bfd_byte), abfd)
00837 != sizeof (bfd_byte))
00838 || bfd_bwrite (sym->name, (bfd_size_type) len, abfd) != len)
00839 return FALSE;
00840
00841 bfd_put_32 (abfd, count + 2, temp);
00842 if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), abfd) != sizeof (temp))
00843 return FALSE;
00844
00845
00846
00847 r.sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
00848 r.howto = &nlm32_alpha_nw_howto;
00849
00850 r.address = nlm_alpha_backend_data (abfd)->lita_address;
00851 r.addend = nlm_alpha_backend_data (abfd)->lita_size + 1;
00852 if (! nlm_alpha_write_import (abfd, (asection *) NULL, &r))
00853 return FALSE;
00854
00855 r.address = nlm_alpha_backend_data (abfd)->gp;
00856 r.addend = 0;
00857 if (! nlm_alpha_write_import (abfd, (asection *) NULL, &r))
00858 return FALSE;
00859
00860 for (i = 0; i < count; i++)
00861 {
00862 if (! nlm_alpha_write_import (abfd, relocs[i].sec, relocs[i].rel))
00863 return FALSE;
00864 }
00865
00866 return TRUE;
00867 }
00868
00869 #include "nlmswap.h"
00870
00871 static const struct nlm_backend_data nlm32_alpha_backend =
00872 {
00873 "NetWare Alpha Module \032",
00874 sizeof (Nlm32_alpha_External_Fixed_Header),
00875 sizeof (struct nlm32_alpha_external_prefix_header),
00876 bfd_arch_alpha,
00877 0,
00878 TRUE,
00879 nlm_alpha_backend_object_p,
00880 nlm_alpha_write_prefix,
00881 nlm_alpha_read_reloc,
00882 nlm_alpha_mangle_relocs,
00883 nlm_alpha_read_import,
00884 nlm_alpha_write_import,
00885 nlm_alpha_set_public_section,
00886 nlm_alpha_get_public_offset,
00887 nlm_swap_fixed_header_in,
00888 nlm_swap_fixed_header_out,
00889 nlm_alpha_write_external,
00890 0,
00891 };
00892
00893 #define TARGET_LITTLE_NAME "nlm32-alpha"
00894 #define TARGET_LITTLE_SYM nlmNAME(alpha_vec)
00895 #define TARGET_BACKEND_DATA &nlm32_alpha_backend
00896
00897 #include "nlm-target.h"