summaryrefslogtreecommitdiff
path: root/lang/tcc/files/patch-tccelf.c
diff options
context:
space:
mode:
authorJohn Marino <marino@FreeBSD.org>2014-06-19 20:13:42 +0000
committerJohn Marino <marino@FreeBSD.org>2014-06-19 20:13:42 +0000
commitb8d66f2d080649dfcea3581c5e79b4260fc07379 (patch)
tree011ac640c74b1f5ebd153c0c6a61a1f0c532e85f /lang/tcc/files/patch-tccelf.c
parent- Support staging (diff)
lang/tcc: Update version 0.9.25 => 0.9.26 and assign maintainer
PR: 191154 Submitted by: Carlos Jacobo Puga Medina Verified by: Redports x4 (i386-only)
Notes
Notes: svn path=/head/; revision=358463
Diffstat (limited to 'lang/tcc/files/patch-tccelf.c')
-rw-r--r--lang/tcc/files/patch-tccelf.c175
1 files changed, 0 insertions, 175 deletions
diff --git a/lang/tcc/files/patch-tccelf.c b/lang/tcc/files/patch-tccelf.c
deleted file mode 100644
index a8a1d68c4fc4..000000000000
--- a/lang/tcc/files/patch-tccelf.c
+++ /dev/null
@@ -1,175 +0,0 @@
-diff -ubwr ./tccelf.c ../../work.2/tcc-0.9.25/tccelf.c
---- ./tccelf.c 2009-05-18 16:27:06.000000000 +0200
-+++ ../../work.2/tcc-0.9.25/tccelf.c 2009-11-29 02:12:36.000000000 +0100
-@@ -1273,7 +1273,7 @@
-
- /* name of ELF interpreter */
- #if defined __FreeBSD__
--static char elf_interp[] = "/usr/libexec/ld-elf.so.1";
-+static char elf_interp[] = "/libexec/ld-elf.so.1";
- #elif defined TCC_ARM_EABI
- static char elf_interp[] = "/lib/ld-linux.so.3";
- #elif defined(TCC_TARGET_X86_64)
-@@ -1306,6 +1306,31 @@
- }
- }
-
-+#if defined(__FreeBSD__)
-+#define HAVE_PHDR 1
-+#define EXTRA_RELITEMS 14
-+
-+/* move the relocation value from .dynsym to .got */
-+void patch_dynsym_undef(TCCState *s1, Section *s)
-+{
-+ uint32_t *gotd = (void *)s1->got->data;
-+ ElfW(Sym) *sym, *sym_end;
-+
-+ gotd += 3; // dummy entries in .got
-+ /* relocate symbols in .dynsym */
-+ sym_end = (ElfW(Sym) *)(s->data + s->data_offset);
-+ for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++) {
-+ if (sym->st_shndx == SHN_UNDEF) {
-+ *gotd++ = sym->st_value + 6; // XXX 6 is magic ?
-+ sym->st_value = 0;
-+ }
-+ }
-+}
-+#else
-+#define HAVE_PHDR 0
-+#define EXTRA_RELITEMS 9
-+#endif
-+
- /* output an ELF file */
- /* XXX: suppress unneeded sections */
- int elf_output_file(TCCState *s1, const char *filename)
-@@ -1324,6 +1349,7 @@
- ElfW(Sym) *sym;
- int type, file_type;
- unsigned long rel_addr, rel_size;
-+ unsigned long bss_addr, bss_size;
-
- file_type = s1->output_type;
- s1->nb_errors = 0;
-@@ -1351,11 +1377,15 @@
-
- if (file_type == TCC_OUTPUT_EXE) {
- char *ptr;
-+ /* allow override the dynamic loader */
-+ char *elfint = getenv("LD_SO");
-+ if (elfint == NULL)
-+ elfint = elf_interp;
- /* add interpreter section only if executable */
- interp = new_section(s1, ".interp", SHT_PROGBITS, SHF_ALLOC);
- interp->sh_addralign = 1;
-- ptr = section_ptr_add(interp, sizeof(elf_interp));
-- strcpy(ptr, elf_interp);
-+ ptr = section_ptr_add(interp, 1+strlen(elfint));
-+ strcpy(ptr, elfint);
- }
-
- /* add dynamic symbol table */
-@@ -1514,7 +1544,7 @@
-
- /* add necessary space for other entries */
- saved_dynamic_data_offset = dynamic->data_offset;
-- dynamic->data_offset += sizeof(ElfW(Dyn)) * 9;
-+ dynamic->data_offset += sizeof(ElfW(Dyn)) * EXTRA_RELITEMS;
- } else {
- /* still need to build got entries in case of static link */
- build_got_entries(s1);
-@@ -1543,7 +1573,7 @@
- break;
- case TCC_OUTPUT_EXE:
- if (!s1->static_link)
-- phnum = 4;
-+ phnum = 4 + HAVE_PHDR;
- else
- phnum = 2;
- break;
-@@ -1620,10 +1650,11 @@
- rel_size = 0;
- rel_addr = 0;
-
-+ bss_addr = bss_size = 0;
- /* leave one program header for the program interpreter */
- ph = &phdr[0];
- if (interp)
-- ph++;
-+ ph += 1 + HAVE_PHDR;
-
- for(j = 0; j < 2; j++) {
- ph->p_type = PT_LOAD;
-@@ -1685,9 +1716,20 @@
- }
- /* update dynamic relocation infos */
- if (s->sh_type == SHT_RELX) {
-+#if defined(__FreeBSD__)
-+ if (!strcmp(strsec->data + s->sh_name, ".rel.got")) { // rel_size == 0) {
-+ rel_addr = addr;
-+ rel_size += s->sh_size; // XXX only first rel.
-+ }
-+ if (!strcmp(strsec->data + s->sh_name, ".rel.bss")) { // rel_size == 0) {
-+ bss_addr = addr;
-+ bss_size = s->sh_size; // XXX only first rel.
-+ }
-+#else
- if (rel_size == 0)
- rel_addr = addr;
- rel_size += s->sh_size;
-+#endif
- }
- addr += s->sh_size;
- if (s->sh_type != SHT_NOBITS)
-@@ -1715,6 +1757,21 @@
- if (interp) {
- ph = &phdr[0];
-
-+#if defined(__FreeBSD__)
-+ {
-+ int len = phnum * sizeof(ElfW(Phdr));
-+
-+ ph->p_type = PT_PHDR;
-+ ph->p_offset = sizeof(ElfW(Ehdr));
-+ ph->p_vaddr = interp->sh_addr - len;
-+ ph->p_paddr = ph->p_vaddr;
-+ ph->p_filesz = ph->p_memsz = len;
-+ ph->p_flags = PF_R | PF_X;
-+ ph->p_align = 4; // interp->sh_addralign;
-+ ph++;
-+ }
-+#endif
-+
- ph->p_type = PT_INTERP;
- ph->p_offset = interp->sh_offset;
- ph->p_vaddr = interp->sh_addr;
-@@ -1815,10 +1872,19 @@
- put_dt(dynamic, DT_RELASZ, rel_size);
- put_dt(dynamic, DT_RELAENT, sizeof(ElfW_Rel));
- #else
-+#if defined(__FreeBSD__)
-+ put_dt(dynamic, DT_PLTGOT, s1->got->sh_addr);
-+ put_dt(dynamic, DT_PLTRELSZ, rel_size);
-+ put_dt(dynamic, DT_JMPREL, rel_addr);
-+ put_dt(dynamic, DT_PLTREL, DT_REL);
-+ put_dt(dynamic, DT_REL, bss_addr);
-+ put_dt(dynamic, DT_RELSZ, bss_size);
-+#else
- put_dt(dynamic, DT_REL, rel_addr);
- put_dt(dynamic, DT_RELSZ, rel_size);
- put_dt(dynamic, DT_RELENT, sizeof(ElfW_Rel));
- #endif
-+#endif
- if (s1->do_debug)
- put_dt(dynamic, DT_DEBUG, 0);
- put_dt(dynamic, DT_NULL, 0);
-@@ -1950,6 +2016,10 @@
- for(i=1;i<s1->nb_sections;i++) {
- s = s1->sections[section_order[i]];
- if (s->sh_type != SHT_NOBITS) {
-+#if defined(__FreeBSD__)
-+ if (s->sh_type == SHT_DYNSYM)
-+ patch_dynsym_undef(s1, s);
-+#endif
- while (offset < s->sh_offset) {
- fputc(0, f);
- offset++;