From ec7009af05cc91797ac90292add5e4dd5cea2973 Mon Sep 17 00:00:00 2001 From: axis Date: Fri, 4 Sep 2009 10:48:38 +0200 Subject: Changed the generation of def files and ordinal maps. Instead of just creating a list, we now create a complete def file using makedeffile and then create the ordinal map from that. In addition we make an exp file, in the same way that Symbian does. --- bin/makedeffile | 48 ++++++++++++++++++++++ bin/makeexpfile | 39 ++++++++++++++++++ bin/makeordinalmap | 41 +++--------------- .../symbian/linux-armcc/features/default_post.prf | 20 +++++++-- 4 files changed, 109 insertions(+), 39 deletions(-) create mode 100755 bin/makedeffile create mode 100755 bin/makeexpfile diff --git a/bin/makedeffile b/bin/makedeffile new file mode 100755 index 0000000..e1534c4 --- /dev/null +++ b/bin/makedeffile @@ -0,0 +1,48 @@ +#!/usr/bin/perl -w + +my $deffile = $ARGV[0]; + +shift @ARGV; + +sub uniqueify { + # String must be sorted beforehand. + my $c; + my $last = $_[0]; + for ($c = 1; $c < scalar(@_); $c++) { + if ($_[$c] eq $last) { + splice(@_, $c, 1); + $c--; + } else { + $last = $_[$c]; + } + } + + return @_; +} + +my @exports; + +foreach (@ARGV) { + my $file; + open($file, "< $_") or die("Could not open $_"); + while (<$file>) { + s/[\r\n]//g; + push (@exports, $_); + } + close($file); +} + +@exports = sort(@exports); + +@exports = uniqueify(@exports); + +open(HANDLE, "> $deffile"); +print (HANDLE "EXPORTS\n; NEW:\n"); +for (my $c = 0; $c < scalar(@exports); $c++) { + if ($exports[$c] =~ /[ ]*([^ ]+)(.*)/) { + print (HANDLE "\t$1 \@ " . ($c + 1) . " NONAME$2\n"); + } +} +print(HANDLE "\n"); +close(HANDLE); + diff --git a/bin/makeexpfile b/bin/makeexpfile new file mode 100755 index 0000000..521791d --- /dev/null +++ b/bin/makeexpfile @@ -0,0 +1,39 @@ +#!/usr/bin/perl -w + +my $deffile = $ARGV[0]; +my $target = $ARGV[1]; + +my @exports; +open (HANDLE, "< $deffile") or die ("Could not open $deffile"); +while () { + while (/(_Z[^ ]+)/xg) { + push (@exports, $1); + } +} +close(HANDLE); + +open(HANDLE, "> $target.s") or die("Could not open $target.s"); +print (HANDLE "\tEXPORT __DLL_Export_Table__\n\n"); +print (HANDLE "\tEXPORT |DLL##ExportTable|\n\n"); +print (HANDLE "\tEXPORT |DLL##ExportTableSize|\n\n"); +print (HANDLE "\tAREA ExportTable, CODE\n"); +print (HANDLE "__DLL_Export_Table__\n"); +print (HANDLE "\tBX lr\n"); +print (HANDLE "|DLL##ExportTableSize|\n"); +print (HANDLE "\tDCD " . scalar(@exports) . "\n"); +print (HANDLE "|DLL##ExportTable|\n"); +print (HANDLE "\tPRESERVE8\n\n"); +for (my $c = 0; $c < scalar(@exports); $c++) { + print (HANDLE "\tIMPORT $exports[$c]\n"); + print (HANDLE "\tDCD $exports[$c] ; \@ ". ($c + 1) . "\n"); +} +print (HANDLE "\n"); +print (HANDLE "\tAREA |.directive|, READONLY, NOALLOC\n"); +print (HANDLE "\tDCB \"##\\n\"\n"); +print (HANDLE "\tDCB \"EXPORT DLL##ExportTable\\n\"\n"); +print (HANDLE "\tDCB \"EXPORT DLL##ExportTableSize\\n\"\n"); +print (HANDLE "\tEND\n"); +close(HANDLE); + +my $result = system("armasm --apcs /inter -o $target $target.s"); +die("Could not execute armar") if ($result); diff --git a/bin/makeordinalmap b/bin/makeordinalmap index 940a9e4..4642772 100755 --- a/bin/makeordinalmap +++ b/bin/makeordinalmap @@ -1,46 +1,17 @@ #!/usr/bin/perl -w my $objects_dir = $ARGV[0]; -my $target = $ARGV[1]; +my $deffile = $ARGV[1]; my $dllFile = $ARGV[2]; - -shift @ARGV; -shift @ARGV; -shift @ARGV; - -sub uniqueify { - # String must be sorted beforehand. - my $c; - my $last = $_[0]; - for ($c = 1; $c < scalar(@_); $c++) { - if ($_[$c] eq $last) { - splice(@_, $c, 1); - $c--; - } else { - $last = $_[$c]; - } - } - - return @_; -} +my $target = $ARGV[3]; my @exports; - -foreach (@ARGV) { - my $file; - open($file, "< $_") or die("Could not open $_"); - while (<$file>) { - push (@exports, $_); +open (HANDLE, "< $deffile") or die ("Could not open $deffile"); +while () { + while (/(_Z[^ ]+)/xg) { + push (@exports, $1); } - close($file); } - -@exports = sort(@exports); - -@exports = uniqueify(@exports); - -open(HANDLE, "> test.txt"); -print (HANDLE join("", @exports)); close(HANDLE); my @ordinalfiles; diff --git a/mkspecs/symbian/linux-armcc/features/default_post.prf b/mkspecs/symbian/linux-armcc/features/default_post.prf index 1d8f565..d575737 100644 --- a/mkspecs/symbian/linux-armcc/features/default_post.prf +++ b/mkspecs/symbian/linux-armcc/features/default_post.prf @@ -4,11 +4,23 @@ exports.input = OBJECTS exports.variable_out = ORDINALMAP exports.CONFIG = no_link -ordinalmap.input = ORDINALMAP +deffile.input = ORDINALMAP +deffile.output = $$OBJECTS_DIR/$${TARGET}.def +deffile.commands = makedeffile $$OBJECTS_DIR/$${TARGET}.def ${QMAKE_FILE_NAME} +deffile.variable_out = DEFFILE +deffile.CONFIG = no_link combine + +expfile.input = DEFFILE +expfile.output = $$OBJECTS_DIR/$${TARGET}.exp +expfile.commands = makeexpfile ${QMAKE_FILE_NAME} $$OBJECTS_DIR/$${TARGET}.exp +expfile.variable_out = PRE_TARGETDEPS + +ordinalmap.input = DEFFILE ordinalmap.output = $$OBJECTS_DIR/$${TARGET}.lib -ordinalmap.commands = makeordinalmap $$OBJECTS_DIR $$OBJECTS_DIR/$${TARGET}.lib $${TARGET}.dll ${QMAKE_FILE_NAME} +ordinalmap.commands = makeordinalmap $$OBJECTS_DIR ${QMAKE_FILE_NAME} $${TARGET}.dll $$OBJECTS_DIR/$${TARGET}.lib ordinalmap.variable_out = PRE_TARGETDEPS -ordinalmap.CONFIG = combine -QMAKE_EXTRA_COMPILERS += ordinalmap QMAKE_EXTRA_COMPILERS += exports +QMAKE_EXTRA_COMPILERS += deffile +QMAKE_EXTRA_COMPILERS += expfile +QMAKE_EXTRA_COMPILERS += ordinalmap -- cgit v0.12