(Update) Re: Objective-C 2.0 on FreeBSD; garbage collection, anyone?

Nerius Landys nlandys at gmail.com
Fri Mar 12 04:15:57 UTC 2010


> Sorry for the delay. Medical problem.
>
> Here's what I know.
>
> 1) Under FreeBSD 8.x OBJC APPEARS NOT to use garbage collection. I
> looked at the source and the GC routines aren't defined anywhere and I
> stepped through the assembly language and the allocation routing call
> malloc(). There is a specific conditional in the FreeBSD compiler that
> cloosed malloc() or GC_malloc() depending on whether a GC variable is
> defined.
>
> 2) Even through you can specify -fobjc-gc on a compile line using the
> FreeBSD compiler, it appears there is no warning issued if GC is not
> enabled.
>
> 3) GCC 45 in the ports directory DOES NOT include OBJC. Neither does 44.
>
> 4) I downloaded GCC and compiled it this way:
>
> ../gcc-4.4.3/configure --disable-nls --disable-rpath
> --prefix=/usr/local/gcc44 --with-system-zlib --enable-languages="c,c
> ++,objc" --enable-objc-gc
>
> I compiled an ObjC program this way:
>
> /usr/local/gcc44/bin/gcc -fobjc-gc -g -O prog.m -lobjc_gc -static
> -pthread
>
> I checked and the GC routines are in there.
>
> I have a Core2 Quad, 8GB of RAM, and 32 GB of swap. I ran "a" program
> (below). No swap activity.  No swap consumption. No increase in memory
> consumption. Five minutes. It hasn't crashed.
>
> YMMV
>
>
> #include <sys/types.h>
> #import <objc/Object.h>
>
> int main(int argc, const char *argv[]) {
>  while (1) {
>    Object *obj = [[Object alloc] init];
>    u_int h = [obj hash];
>  }
>  return 0;
> }
>

Wow thanks, that really helps.  I now understand more about how this
stuff works.  I'm kind of new to C programming in general, and library
linking and all that sort of stuff.

My gcc command is like this now:

  /usr/opt/gcc44/bin/gcc -o main Main.m MyObj.m -lobjc_gc -lpthread -static

The "-static" is nice because my libobjc_gc.so is in a non-standard
location on my system, namely /usr/opt/gcc44/lib/ , and so I don't
have to specify LD_LIBRARY_PATH if I compile with "-static" (but as a
result the binary is larger and takes more memory to run, by about 700
kilobytes).

The "-lpthread" is necessary because pthreads are used as part of the
garbage collection process.

The "-lobjc_gc" is used instead of "-lobjc" to enable garbage collection.

I compiled gcc 4.4.3 (downloaded directly from links on gcc.gnu.org)
myself (not from ports), with
  ./configure --prefix=/usr/opt/gcc44 --enable-objc-gc
-enable-languages="c,c++,objc"

My source code looks like this:

Main.m
---------------------
#import <pthread.h>
#import "MyObj.h"
int main(int argc, const char *argv[]) {
  while (YES) {
    MyObj *obj = [[MyObj alloc] init];
    [obj hash];
  }
  return 0;
}

MyObj.h
----------------------
#import <objc/Object.h>
@interface MyObj : Object {}
@end

MyObj.m
----------------
#import "MyObj.h"
@implementation MyObj
@end


I get no memory increases in my program.

I have not tried to get garbage collection to work with GNUstep yet.
It very well may not work, because the garbage collection is probably
tied to objc_gc (for example instead of gnustep-base or
gnustep-runtime or something like that).  Like I said I don't know too
much about C programming at this point.  I do see a libgnustep-base.so
in my GNUstep installation, but I don't see anything of the form
*_gc.so.

I'm going to write some programs just using Object, not using GNUstep
at this point.  I think I'll wait until I get an Apple and an iPhone
before I try to use the other object classes (NSObject and friends).


More information about the freebsd-questions mailing list