summaryrefslogtreecommitdiff
path: root/src/cmd/ld/symtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/ld/symtab.c')
-rw-r--r--src/cmd/ld/symtab.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/cmd/ld/symtab.c b/src/cmd/ld/symtab.c
index 26e4def64..22777b6b5 100644
--- a/src/cmd/ld/symtab.c
+++ b/src/cmd/ld/symtab.c
@@ -136,6 +136,62 @@ asmelfsym32(void)
genasmsym(putelfsym32);
}
+void
+putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
+{
+ int i;
+
+ switch(t) {
+ case 'T':
+ case 't':
+ case 'L':
+ case 'l':
+ case 'D':
+ case 'd':
+ case 'B':
+ case 'b':
+ case 'a':
+ case 'p':
+
+ case 'f':
+ case 'z':
+ case 'Z':
+
+ case 'm':
+ lputb(addr);
+ cput(t+0x80); /* 0x80 is variable length */
+
+ if(t == 'z' || t == 'Z') {
+ cput(0);
+ for(i=1; s[i] != 0 || s[i+1] != 0; i += 2) {
+ cput(s[i]);
+ cput(s[i+1]);
+ }
+ cput(0);
+ cput(0);
+ i++;
+ } else {
+ /* skip the '<' in filenames */
+ if(t=='f')
+ s++;
+
+ for(i=0; s[i]; i++)
+ cput(s[i]);
+ cput(0);
+ }
+
+ symsize += 4 + 1 + i + 1;
+ break;
+ default:
+ return;
+ };
+}
+
+void
+asmplan9sym(void)
+{
+ genasmsym(putplan9sym);
+}
static Sym *symt;
@@ -165,6 +221,52 @@ slputb(int32 v)
}
void
+wputl(ushort w)
+{
+ cput(w);
+ cput(w>>8);
+}
+
+void
+wputb(ushort w)
+{
+ cput(w>>8);
+ cput(w);
+}
+
+void
+lputb(int32 l)
+{
+ cput(l>>24);
+ cput(l>>16);
+ cput(l>>8);
+ cput(l);
+}
+
+void
+lputl(int32 l)
+{
+ cput(l);
+ cput(l>>8);
+ cput(l>>16);
+ cput(l>>24);
+}
+
+void
+vputb(uint64 v)
+{
+ lputb(v>>32);
+ lputb(v);
+}
+
+void
+vputl(uint64 v)
+{
+ lputl(v);
+ lputl(v >> 32);
+}
+
+void
putsymb(Sym *s, char *name, int t, vlong v, vlong size, int ver, Sym *typ)
{
int i, f, l;