The execv on Linux also fails when we can an builtin program, try it:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int ret;
if (argc < 2)
{
static char * const args[2] =
{
"true",
NULL
};
ret = execv(args[0], args);
if (ret < 0)
{
printf("execv failed: %d\n", ret);
}
}
}
The name convention on NuttX is a little bit different from Linux/Unix:
https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
In NuttX the builtins are the programs that are not internal in
NuttShell itself, but compiled separated and executed in the nsh.
BR,
Alan
On 10/12/23, Alan C. Assis <[email protected]> wrote:
> Ah ok, I tested using the original code with "ls" instead "/bin/ls"
> and the result as similar to NuttX: didn't print anything.
>
> I discovered the issue: ls is not a buildin program, you need to call
> a builtin program to get it working.
>
> I modified apps/examples/null to print an incentive message !
>
> /****************************************************************************
> * Name: null_main
> ****************************************************************************/
>
> int main(int argc, char *argv[])
> {
> printf("We did it, not because it is easy! But because we thought it
> was easy!\n");
> return 0;
> }
>
> And modified hello to call this null application:
>
> int main(int argc, char *argv[])
> {
> int ret;
>
> if (argc < 2)
> {
> static char * const args[2] =
> {
> "null",
> NULL
> };
>
> ret = execv(args[0], args);
> if (ret < 0)
> {
> printf("Error: execv failed: %d\n", ret);
> }
> }
> }
>
> See the result:
>
> NuttShell (NSH) NuttX-12.3.0-RC0
> nsh> ?
> help usage: help [-v] [<cmd>]
>
> . cd exit mount source uptime
> [ cp false mv test usleep
> ? cmp help printf time xd
> alias dirname hexdump pwd true
> unalias dd kill rm truncate
> basename dmesg ls rmdir uname
> break echo mkdir set umount
> cat exec mkrd sleep unset
>
> Builtin Apps:
> hello nsh null sh
> nsh> hello
> We did it, not because it is easy! But because we thought it was easy!
> nsh>
>
> Just used the DEBUG to find-out the issue, the debug binary loader
> said exactly what was the issue.
>
> BR,
>
> Alan
>
> On 10/12/23, MIGUEL ALEXANDRE WISINTAINER <[email protected]> wrote:
>> 1 hour ago, not 1 year agoπ
>> ________________________________
>> De: MIGUEL ALEXANDRE WISINTAINER <[email protected]>
>> Enviado: quinta-feira, 12 de outubro de 2023 19:07
>> Para: [email protected] <[email protected]>
>> Assunto: RE: execv obsolet ?
>>
>> yes, i already had done that 1 year ago
>>
>> ubuntu@DESKTOP-GRCNLV8:~$ nano hello_main.c
>> ubuntu@DESKTOP-GRCNLV8:~$ gcc hello_main.c -o hello_main
>> ubuntu@DESKTOP-GRCNLV8:~$ ./hello_main
>> Executing 1 /bin/ls
>> Espruino esp kitware-archive.sh.1
>> nuttx mbed rust esp-adf
>> RIOT esp-va-sdk kitware-archive.sh.2
>> tinygo thread-os freertos
>> a.out esp32_binary_merger lora-modem-abz-1.2.5
>> tinygo_0.26.0_amd64.deb
>> blink go
>> lora-modem-abz-1.2.5.zip
>> zephyr-sdk-0.15.0 embedded-os-beta-esp32c
>> cmake-3.21.1-Linux-x86_64.sh hello_main loramac-node
>> zephyr-sdk-0.15.0_linux-x86_64.tar.gz
>> drogue-device hello_main.c minicom.log
>> zephyr-sdk-0.15.1_linux-x86_64.tar.gz
>> embassy kitware-archive.sh mynewt
>>
>> On linux works
>>
>> On nuttx not...i tried the path to...but...the problem is where is the
>> path
>> of ls
>>
>> "/ls"
>>
>> if (argc < 2)
>> {
>> static char * const args[2] =
>> {
>> "/bin/ls",
>> NULL
>> };
>> printf("Executing 1 %s \n", args[0]);
>> execv(args[0], args);
>> }
>>
>> ________________________________
>> De: Alan C. Assis <[email protected]>
>> Enviado: quinta-feira, 12 de outubro de 2023 18:48
>> Para: [email protected] <[email protected]>
>> Assunto: Re: execv obsolet ?
>>
>> Hi Miguel,
>>
>> I suggest you to try first in the Linux.
>>
>> NuttX should give you the same result ;-)
>>
>> BR,
>>
>> Alan
>>
>> On 10/12/23, MIGUEL ALEXANDRE WISINTAINER <[email protected]> wrote:
>>> Now compiles π
>>>
>>> in theory should show the files got from ls on terminal ?
>>>
>>> Builtin Apps:
>>> i2c sh hello nsh
>>> nsh> hello
>>> nsh>
>>>
>>> =============
>>>
>>> #include <nuttx/config.h>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <unistd.h>
>>>
>>>
>>> #ifdef CONFIG_BUILD_KERNEL
>>> int main(int argc, FAR char *argv[])
>>> #else
>>> int hello_main(int argc, char *argv[])
>>> #endif
>>> {
>>>
>>> if (argc < 2)
>>> {
>>> ββββββstatic char * const args[2] =
>>> ββββββ{
>>> ββββββββββββ"ls",
>>> ββββββββββββNULL
>>> ββββββ};
>>>
>>> ββββββexecv(args[0], args);
>>> }
>>> De: Xiang Xiao <[email protected]>
>>> Enviado: quinta-feira, 12 de outubro de 2023 18:08
>>> Para: [email protected] <[email protected]>
>>> Assunto: Re: execv obsolet ?
>>>
>>> you need enable CONFIG_LIBC_EXECFUNCS:
>>> https://github.com/apache/nuttx/blob/master/libs/libc/unistd/lib_execv.c#L29
>>>
>>> On Fri, Oct 13, 2023 at 1:59β―AM MIGUEL ALEXANDRE WISINTAINER <
>>> [email protected]> wrote:
>>>
>>>> #include <nuttx/config.h>
>>>> #include <stdio.h>
>>>> #include <stdlib.h>
>>>> #include <unistd.h>
>>>>
>>>> #ifdef CONFIG_BUILD_KERNEL
>>>> int main(int argc, FAR char *argv[])
>>>> #else
>>>> int hello_main(int argc, char *argv[])
>>>> #endif
>>>> {
>>>>
>>>> if (argc < 2)
>>>> {
>>>> static char * const args[2] =
>>>> {
>>>> "/bin/ls",
>>>> NULL
>>>> };
>>>>
>>>> execv(args[0], args);
>>>> }
>>>>
>>>> else
>>>> {
>>>> int i;
>>>>
>>>> for (i = 1; i < argc; i++)
>>>> {
>>>> static char * const args[3] =
>>>> {
>>>> "/bin/ls",
>>>> NULL,
>>>> NULL
>>>> };
>>>> args[1] = argv[i];
>>>> execv(args[0], args);
>>>> }
>>>> }
>>>> return EXIT_SUCCESS;
>>>> }
>>>>
>>>> hello_main.c:(.text.hello_main+0xe): undefined reference to `execv'
>>>> xtensa-esp32-elf-ld: hello_main.c:(.text.hello_main+0x20): undefined
>>>> reference to `execv'
>>>> make[1]: *** [Makefile:173: nuttx] Error 1
>>>> make: *** [tools/Unix.mk:537: nuttx] Error 2
>>>>
>>>
>>
>