| Deutsch English Français Italiano |
|
<v3fr28$2tmmv$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: bart <bc@freeuk.com>
Newsgroups: comp.lang.c
Subject: Re: C23 thoughts and opinions
Date: Sat, 1 Jun 2024 19:59:19 +0100
Organization: A noiseless patient Spider
Lines: 104
Message-ID: <v3fr28$2tmmv$1@dont-email.me>
References: <v2l828$18v7f$1@dont-email.me> <v38of2$1gsj2$1@dont-email.me>
<v39v87$1n7bk$1@dont-email.me> <20240530170836.00005fa0@yahoo.com>
<v3a3k5$1ntrn$1@dont-email.me> <20240530180345.00003d9f@yahoo.com>
<v3chc4$27uij$1@dont-email.me> <20240531161937.000063af@yahoo.com>
<20240531162811.00006719@yahoo.com> <20240531164835.00007128@yahoo.com>
<v3cldt$28n91$2@dont-email.me> <20240531173437.00003bee@yahoo.com>
<v3d3ct$2b5sl$1@dont-email.me> <yMo6O.3723$zfC8.2197@fx35.iad>
<v3dem9$2d2v4$1@dont-email.me> <TLu6O.6222$xPJ1.816@fx09.iad>
<v3essl$2nsh7$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Sat, 01 Jun 2024 20:59:20 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="91ec5d79126354b953c01cb00293891d";
logging-data="3070687"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/BxQCtb2Fw1W05grRx9PEu"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:HZsniN557Elosrsw9TiRRa/6wcI=
Content-Language: en-GB
In-Reply-To: <v3essl$2nsh7$1@dont-email.me>
Bytes: 4592
On 01/06/2024 11:24, bart wrote:
> On 01/06/2024 02:25, Scott Lurndal wrote:
[objcopy]
>
> Nope, same thing. This doesn't inspire much confidence. With values
> shown, the actual size IS contained within the _size value, but only as
> the last 16 bits of the value.
>
> gcc versions were 10.3.0 and 9.4.0 respectively; the latter is what is
> provided by Windows 11.
>
> You also brought up the fact that the size is not known to the compiler
> anyway, which means a few things are not possible, like using the size
> in a static context.
I thought I'd dash off my own version of 'objcopy' to see if I could do
any better. This version does binary/text to COFF only. The input file
here was a .wav file:
C:\qapps>qq objcopy test.wav # running my objcopy
Compiling test.m to test.obj
Written test.obj # haven't settled on naming schemes yet
char[] name is: test_wav
u64 size name is: test_wav_len
C:\qapps>gcc demo.c test.obj
C:\qapps>a
Size = 14355
Data = 52 49 46 ...
The demo.c file is this:
#include <stdio.h>
extern char test_wav[];
extern long long test_wav_len;
int main(void) {
printf("Size = %lld\n", test_wav_len);
printf("Data = %02x %02x %02x ...\n", test_wav[0], test_wav[1],
test_wav[2]);
}
And this is info about the binary to show the right data has got into
the C program:
C:\qapps>dir test.wav
01/11/1996 04:05 14,354 test.wav
C:\qapps>dump test.wav
Dump of test.wav; Size = 14354 bytes
0000: 52 49 46 46 0A 38 00 00 57 41 56 45 66 6D 74 20 RIFF.8..WAVEfmt
There is one slight discrepancy: the size from the C file is one byte
bigger; that's because I'm using 'strinclude' (in the code compiled
during the process, which adds a terminator. I can fix that easily, or
allow the option.
The script used to implement my 'objcopy' is shown below. It writes out
a 2-line program which is compiled by my systems language into an object
file.
------------------------------------------------
proc main=
if ncmdparams<1 then
println "Usage:"
println " qq objcopy filename [name]"
stop
fi
infile:=cmdparams[1]
basename:=extractbasefile(infile)
mfile:=basename+".m"
objfile:=basename+".obj"
if infile in (mfile, objfile) then abort("Name clash") fi
name:=basename+"_"+extractext(infile)
if ncmdparams>1 then
name:=cmdparams[2]
fi
writetextfile(mfile, (
sfprint("export []byte # = strinclude(""#"")",name,
infile),
sfprint("export int #_len = #.len", name, name)
)
)
if system("mm -obj "+mfile)<>0 then
abort("Compile error on "+mfile)
else
println "Written", objfile
println "char[] name is:",name
println "u64 size name is:",name+"_len"
fi
end