Re: Are we on?
Callum Gibson <[email protected]> Tue, 22 Dec 2009 12:54:34 +1100
| Newsgroups | gmane.comp.debugging.ups.user |
|---|---|
| Message-ID | <[email protected]> |
--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On 18Dec09 15:34, Bakul Shah wrote:
}I'd love to see the FreeBSD port of ups get resurrected. Any
}chance to get the patches? Thanks.
I received word back from Tom Hughes. He still makes commits to sourceforge.
Since there has been some interest, here are my patches to get things
going under FreeBSD/i386 RELENG_7. Should also work on 8.X.
I've attached 2 separate diffs. The first diffs.freebsd, was to get it
to compile cleanly on FreeBSD, however I believe some of the diffs are
not FreeBSD specific. In particular, the cleanup around the definition
of some of the Elf_* variables to avoid some of the weirdness (like Elf32
functions being defined to Elf64 functions and vice versa) depending on
the architecture. In any case, it should be harmless to apply the diffs
under any operating system.
I hasten to add, I have not tried this on FreeBSD/amd64 as yet, but will
get around to that.
The second file, diffs.fix, addresses some bugs with the new dwarf code,
mostly in the form of uninitialised memory, but also completing the refactoring
of a new internal type that was introduced. I was getting crashes when
expanding struct members until I tracked these down.
Under FreeBSD, you need to use "configure --enable-elf" to make it
work properly. Most BSD based systems have moved to elf from a.out format
now whereas ups assumes a.out still.
After running configure you need to edit ifdefs.h and change HAVE_GLOBAL_IOB
to 0 because FreeBSD's stdio doesn't have an accessible IOB structure for
ups to frob around in, in spite of what configure thinks. The test for
"__sF.*" in configure.in is too general for FreeBSD's header. Probably
"\<__sF\>" would be better.
Finally, you'll need to use "patch -p1" to use these diffs.
C
--
****** Do not contact me directly for application support ******
*** Email: [email protected] Hotline: +61 2 8258 2709 ***
Callum Gibson [email protected] +61 438 266 463 (Mob)
Rates IT, Deutsche Bank, Australia [/] +61 2 8258 1620 (Wrk)
--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="diffs.fix"
diff -ruw ups-freebsd/ups/ao_symparse.c ups-fixed/ups/ao_symparse.c
--- ups-freebsd/ups/ao_symparse.c 2009-11-02 10:51:38.000000000 +1100
+++ ups-fixed/ups/ao_symparse.c 2009-12-18 10:40:23.000000000 +1100
@@ -2016,6 +2016,7 @@
v->va_flags = VA_BASECLASS;
v->va_class = CL_MOS;
v->va_type = rtype?rtype:get_safe_type_ptr();
+ v->va_location = NULL;
v->va_next = next;
ci_make_baseclass_name(v);
next = v;
@@ -2039,6 +2040,7 @@
v->va_flags = VA_BASECLASS|VA_HIDE_PTR;
v->va_class = CL_MOS;
v->va_type = rtype?rtype:get_safe_type_ptr();
+ v->va_location = NULL;
v->va_next = next;
ci_make_baseclass_name(v);
next = v;
@@ -2212,6 +2214,7 @@
v->va_flags = VA_BASECLASS;
v->va_class = CL_MOS;
v->va_type = rtype?rtype:get_safe_type_ptr();
+ v->va_location = NULL;
v->va_next = next;
next = v;
if ( virtual )
@@ -2343,6 +2346,7 @@
v->va_flags = VA_STATIC_MEMBER;
v->va_class = CL_MOS;
v->va_type = get_safe_type_ptr(); /* point to something safe */
+ v->va_location = NULL;
v->va_next = next;
next = v;
if (*s == '\\')
@@ -2400,6 +2404,7 @@
bump_str(sr, &s);
v->va_addr = parse_num(stf, sr, &s);
v->va_class = CL_MOS;
+ v->va_location = NULL;
v->va_next = next;
next = v;
@@ -2451,6 +2456,7 @@
1, compiler, FALSE); /* RGA */
v->va_language = stf->stf_language;
v->va_flags = 0;
+ v->va_location = NULL;
v->va_class = is_struct ? CL_MOS : CL_MOU;
if (compiler == CT_GNU_CC )
{
diff -ruw ups-freebsd/ups/expr.c ups-fixed/ups/expr.c
--- ups-freebsd/ups/expr.c 2009-11-02 10:51:53.000000000 +1100
+++ ups-fixed/ups/expr.c 2009-12-17 16:44:43.000000000 +1100
@@ -506,7 +506,7 @@
sel_t *sel;
objid_t par, var_obj;
int objtype;
- var_t *v;
+ var_t *v = NULL;
taddr_t addr;
/* Check that we have a single variable selected.
diff -ruw ups-freebsd/ups/va_decl.c ups-fixed/ups/va_decl.c
--- ups-freebsd/ups/va_decl.c 2009-11-02 10:52:07.000000000 +1100
+++ ups-fixed/ups/va_decl.c 2009-12-18 11:35:23.000000000 +1100
@@ -276,6 +276,9 @@
type = type->ty_base;
++level;
}
+ /* skip down to true base type - not the same as derivation */
+ while ( type->ty_code == PI_SAME_AS)
+ type = type->ty_base;
bt = type->ty_code;
if (bt == TY_BITFIELD) {
--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="diffs.freebsd"
diff -ruw ups-cvs/lib/libdwarf/pro_alloc.c ups-freebsd/lib/libdwarf/pro_alloc.c
--- ups-cvs/lib/libdwarf/pro_alloc.c 2009-07-08 00:10:09.000000000 +1000
+++ ups-freebsd/lib/libdwarf/pro_alloc.c 2009-11-02 12:47:08.000000000 +1100
@@ -44,7 +44,9 @@
#ifdef HAVE_STRING_H
#include <string.h>
#endif /* HAVE_STRING_H */
+#ifndef __FreeBSD__
#include <malloc.h>
+#endif
/*
When each block is allocated, there is a two-word structure
diff -ruw ups-cvs/ups/ao_elfpriv.h ups-freebsd/ups/ao_elfpriv.h
--- ups-cvs/ups/ao_elfpriv.h 2005-07-29 22:56:59.000000000 +1000
+++ ups-freebsd/ups/ao_elfpriv.h 2009-11-02 16:01:18.000000000 +1100
@@ -35,6 +35,7 @@
#define LIBDEP_TYPEDEFED
#endif
+#ifndef _SYS_ELF_GENERIC_H_
#ifndef Elf_Ehdr
typedef struct Elf_Ehdr Elf_Ehdr;
#endif
@@ -54,6 +55,7 @@
#ifndef Elf_Dyn
typedef struct Elf_Dyn Elf_Dyn;
#endif
+#endif
struct Elfinfo {
alloc_pool_t *apool;
diff -ruw ups-cvs/ups/ao_elfread32.c ups-freebsd/ups/ao_elfread32.c
--- ups-cvs/ups/ao_elfread32.c 2004-02-17 00:02:00.000000000 +1100
+++ ups-freebsd/ups/ao_elfread32.c 2009-11-02 17:04:36.000000000 +1100
@@ -25,6 +25,7 @@
#define ELF_ADDRESS_SIZE 32
+/*
#define Elf_Addr Elf32_Addr
#define Elf_Ehdr Elf32_Ehdr
#define Elf_Shdr Elf32_Shdr
@@ -33,6 +34,7 @@
#define Elf_Dyn Elf32_Dyn
#define Elf_Rel Elf32_Rel
#define Elf_Rela Elf32_Rela
+*/
#define ELF_ST_TYPE(val) ELF32_ST_TYPE(val)
#define ELF_ST_BIND(val) ELF32_ST_BIND(val)
diff -ruw ups-cvs/ups/ao_elfread64.c ups-freebsd/ups/ao_elfread64.c
--- ups-cvs/ups/ao_elfread64.c 2004-02-17 00:02:00.000000000 +1100
+++ ups-freebsd/ups/ao_elfread64.c 2009-11-02 17:04:49.000000000 +1100
@@ -25,6 +25,7 @@
#define ELF_ADDRESS_SIZE 64
+/*
#define Elf_Addr Elf64_Addr
#define Elf_Ehdr Elf64_Ehdr
#define Elf_Shdr Elf64_Shdr
@@ -33,6 +34,7 @@
#define Elf_Dyn Elf64_Dyn
#define Elf_Rel Elf64_Rel
#define Elf_Rela Elf64_Rela
+*/
#define ELF_ST_TYPE(val) ELF64_ST_TYPE(val)
#define ELF_ST_BIND(val) ELF64_ST_BIND(val)
diff -ruw ups-cvs/ups/ao_elfreadbase.c ups-freebsd/ups/ao_elfreadbase.c
--- ups-cvs/ups/ao_elfreadbase.c 2005-02-22 04:01:22.000000000 +1100
+++ ups-freebsd/ups/ao_elfreadbase.c 2009-11-02 17:26:01.000000000 +1100
@@ -50,6 +50,15 @@
#include "ao_elflib.h"
#include "elfstab.h"
+#define Elf_Addr __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Addr)
+#define Elf_Ehdr __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Ehdr)
+#define Elf_Shdr __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Shdr)
+#define Elf_Phdr __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Phdr)
+#define Elf_Sym __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Sym)
+#define Elf_Dyn __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Dyn)
+#define Elf_Rel __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Rel)
+#define Elf_Rela __CONCAT(__CONCAT(Elf,ELF_ADDRESS_SIZE),_Rela)
+
struct elf_r_debug {
int r_version;
Elf_Addr r_map;
diff -ruw ups-cvs/ups/ao_pt_regs.c ups-freebsd/ups/ao_pt_regs.c
--- ups-cvs/ups/ao_pt_regs.c 2004-02-21 23:57:22.000000000 +1100
+++ ups-freebsd/ups/ao_pt_regs.c 2009-11-02 15:50:56.000000000 +1100
@@ -491,7 +491,7 @@
/* FreeBSD : .../sys/i386/i386/machdep.c
* dr6 is status register, dr7 is control register.
*/
- return (pr->dbregs.dr6 & 0x0000000f);
+ return (pr->dbregs.dr[6] & 0x0000000f);
}
/*
diff -ruw ups-cvs/ups/ao_pt_uarea.c ups-freebsd/ups/ao_pt_uarea.c
--- ups-cvs/ups/ao_pt_uarea.c 2006-09-01 19:44:42.000000000 +1000
+++ ups-freebsd/ups/ao_pt_uarea.c 2009-11-02 15:54:00.000000000 +1100
@@ -233,10 +233,10 @@
};
#endif
taddr_t addr;
- int flags, offset, i, *regmap;
+ int offset, i, *regmap;
- flags = (*get_uarea_word)(arg, (int)U_OFFSET(u_pcb.pcb_flags));
#if defined(bsdi)
+ int flags = (*get_uarea_word)(arg, (int)U_OFFSET(u_pcb.pcb_flags));
regmap = ((flags & FM_TRAP) != 0) ? trapregs : syscallregs;
addr = (*get_uarea_word)(arg, (int)U_OFFSET(u_kproc.kp_proc.p_regs));
#elif defined(KINFO_PROC_SIZE)
@@ -246,7 +246,7 @@
struct proc *paddr;
regmap = trapregs;
paddr = (struct proc *)(*get_uarea_word)(arg, (int)U_OFFSET(u_kproc.ki_paddr));
- addr = (*get_uarea_word)(arg, (int)(paddr->p_md.md_regs));
+ addr = (*get_uarea_word)(arg, (int)(paddr->p_md.md_ldt->ldt_base));
}
#else
regmap = trapregs;
@@ -797,7 +797,7 @@
#if defined(ARCH_MIPS)
uaddr = (char *)(SIG_BASE + signo);
#elif defined(ARCH_BSDI386)
- uaddr = U_OFFSET(u_sigacts.ps_sigact[signo]);
+ uaddr = U_OFFSET(u_kproc.ki_paddr->p_sigacts[signo]);
#elif defined(ARCH_SUN4) && defined(CPU_ARCH)
uaddr = U_OFFSET(u_signal[signo]) + sparc_u_offset();
#else
diff -ruw ups-cvs/ups/ao_ptrace.c ups-freebsd/ups/ao_ptrace.c
--- ups-cvs/ups/ao_ptrace.c 2009-07-13 23:47:37.000000000 +1000
+++ ups-freebsd/ups/ao_ptrace.c 2009-11-02 15:47:24.000000000 +1100
@@ -882,14 +882,13 @@
taddr_t control;
unsigned flags;
int i;
+ int watchnum;
if (size > 8 || (size & (size - 1)) != 0 || addr % size != 0)
return -1;
#ifndef ARCH_386_64
if (size == 8) {
- int watchnum;
-
if ((watchnum = ptrace_install_watchpoint(ip, addr, 4)) < 0)
return -1;
if ((i = ptrace_install_watchpoint(ip, addr + 4, 4)) < 0) {
diff -ruw ups-cvs/ups/ao_regs.c ups-freebsd/ups/ao_regs.c
--- ups-cvs/ups/ao_regs.c 2004-02-17 00:02:00.000000000 +1100
+++ ups-freebsd/ups/ao_regs.c 2009-11-02 15:21:20.000000000 +1100
@@ -55,7 +55,9 @@
static const int *regmap64 = NULL;
-#elif defined(ARCH_FREEBSD386) && defined(z__FreeBSD__) && __FreeBSD__ > 3
+#elif defined(ARCH_FREEBSD386) && defined(__FreeBSD__) && __FreeBSD__ > 3
+
+#include <machine/reg.h>
static const int regmap32[] = {
/* 9 8 7 6 5 4 3 2 */
diff -ruw ups-cvs/ups/ci_compile_expr.c ups-freebsd/ups/ci_compile_expr.c
--- ups-cvs/ups/ci_compile_expr.c 2006-06-22 19:03:51.000000000 +1000
+++ ups-freebsd/ups/ci_compile_expr.c 2009-11-02 13:19:46.000000000 +1100
@@ -595,8 +595,10 @@
switch (typesize) {
case 4:
return LONG_FORM_OFFSET;
+#if WANT_LL
case 8:
return LONGLONG_FORM_OFFSET;
+#endif
default:
ci_panic("bad size in oo");
return 0; /* to satisfy gcc */
diff -ruw ups-cvs/ups/target.h ups-freebsd/ups/target.h
--- ups-cvs/ups/target.h 2009-07-13 23:47:37.000000000 +1000
+++ ups-freebsd/ups/target.h 2009-11-02 13:13:56.000000000 +1100
@@ -29,6 +29,8 @@
typedef struct symtab_s symtab_t;
#endif
+#include <signal.h>
+
/* Various states of of the target process.
*/
typedef enum tstateen {
--uAKRQypu60I7Lcqm--