}
if (rel) {
- reloc = elf_reloc_entry_new(sym, bc->offset + offset, R_386_PC32);
-
/* Need to reference to start of section, so add $$ in. */
*ep = yasm_expr_new(YASM_EXPR_ADD, yasm_expr_expr(*ep),
yasm_expr_sym(yasm_symrec_define_label("$$", info->sect,
yasm_expr_int(yasm_intnum_new_uint(bc->offset + offset)),
(*ep)->line);
*ep = yasm_expr_simplify(*ep, yasm_common_calc_bc_dist);
- } else
- reloc = elf_reloc_entry_new(sym, bc->offset + offset, R_386_32);
+ }
+ reloc = elf_reloc_entry_new(sym, bc->offset + offset, rel);
/* allocate .rel sections on a need-basis */
if (elf_secthead_append_reloc(info->shead, reloc))
elf_objfmt_parse_scnum++;
elf_reloc_entry *
elf_reloc_entry_new(yasm_symrec *sym,
elf_address addr,
- elf_relocation_type rtype)
+ int rel)
{
elf_reloc_entry *entry = yasm_xmalloc(sizeof(elf_reloc_entry));
entry->sym = sym;
entry->addr = addr;
- entry->rtype = rtype;
+ entry->rtype = rel ? R_386_PC32 : R_386_32;
return entry;
}
-/*
+/* $IdPath$
* ELF object format helpers
*
* Copyright (C) 2003 Michael Urman
STN_UNDEF = 0
} elf_symbol_index;
+
+/* internal only object definitions */
+#ifdef YASM_OBJFMT_ELF_INTERNAL
+
+#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
+#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
+
/* elf relocation type - index of semantics */
typedef enum {
R_386_NONE = 0, /* none */
R_386_GOTPC = 10 /* word, GOT + A - P */
} elf_relocation_type;
-
-/* internal only object definitions */
-#ifdef YASM_OBJFMT_ELF_INTERNAL
-
-#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
-
struct elf_secthead {
elf_section_type type;
elf_section_flags flags;
/* reloc functions */
elf_reloc_entry *elf_reloc_entry_new(yasm_symrec *sym,
elf_address addr,
- elf_relocation_type rtype);
+ int rel);
void elf_reloc_entry_delete(elf_reloc_entry *entry);
elf_reloc_head *elf_relocs_new(void);
void elf_reloc_delete(elf_reloc_head *head);