On Fri, Mar 6, 2020 at 10:25 PM Jacob Ritorto via cctalk <
cctalk at classiccmp.org> wrote:
Thanks for the leads, everyone!
I made a little progress: I did read enough about ld to get it to load
the .o files from the initial cc run into a separate I&d overlaid
executable. But when I execute it, it gives me Segmentation fault
(core dumped).. There was one complaint of Undefined during the ld run
even though I said -lc_p (and validated that _environ is in that .a
file using nm.
Undefined:
_environ
but it seemed to succeed in building the executable despite that.
Well, I'm guessing it succeeded because the output file rogue is
sitting there afterwards and has been marked executable, which,
according to the man page, ld doesn't mark that way unless it
succeeds.
[35] root--> ld -t -v -M -i -X -x init.o main.o level.o score.o
machdep.o inventory.o -Z hit.o monster.o -Z message.o move.o -Z
object.o pack.o play.o -Z curses.o random.o ring.o -Z room.o -Z save.o
spec_hit.o -Z throw.o trap.o -Z use.o zap.o -Y -o rogue -lcurses
-ltermlib -lc_p
[36] root--> size rogue
text data bss dec hex
44928 18554 10520 74002 12112 total text: 88704
overlays: 7616,6144,7488,1856,4352,6144,3840,6336
[37] root--> ./rogue
Segmentation fault (core dumped)
See anything amiss in my process? That Undefined _environ during ld
still bugs me.
Is the next step dissecting the program or its core with adb to find
what's wrong?
You should check to see if crt saves the third argument to start/main.
That's what environ is. But you'll need to look at the code.
src/lib/libc/gen/getenv expects environ to be a global variable:
extern char **environ;
and if getenv is called, that may be where that comes from. It's defined in
pdp/csu/crt0.s:_environ: .=.+2 / others
where it also looks to be set. Is crt0.o not getting pulled in for some
reason?
Warner