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 <acas...@gmail.com> 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 <tcpipc...@hotmail.com> wrote:
>>  1 hour ago, not 1 year agoπŸ™‚
>> ________________________________
>> De: MIGUEL ALEXANDRE WISINTAINER <tcpipc...@hotmail.com>
>> Enviado: quinta-feira, 12 de outubro de 2023 19:07
>> Para: dev@nuttx.apache.org <dev@nuttx.apache.org>
>> 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 <acas...@gmail.com>
>> Enviado: quinta-feira, 12 de outubro de 2023 18:48
>> Para: dev@nuttx.apache.org <dev@nuttx.apache.org>
>> 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 <tcpipc...@hotmail.com> 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 <xiaoxiang781...@gmail.com>
>>> Enviado: quinta-feira, 12 de outubro de 2023 18:08
>>> Para: dev@nuttx.apache.org <dev@nuttx.apache.org>
>>> 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 <
>>> tcpipc...@hotmail.com> 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
>>>>
>>>
>>
>

Reply via email to