How does gcc find as, ld and other binutils executables?












12















Is their location hardcoded into gcc code or does gcc just call as and we must have as location in our PATH variable?



And in the latter case, how could we create two completely separate gcc toolchains? I mean, how can we make gcc-A invoke as-A and gcc-B invoke as-B if as-A and as-B are both called as?










share|improve this question





























    12















    Is their location hardcoded into gcc code or does gcc just call as and we must have as location in our PATH variable?



    And in the latter case, how could we create two completely separate gcc toolchains? I mean, how can we make gcc-A invoke as-A and gcc-B invoke as-B if as-A and as-B are both called as?










    share|improve this question



























      12












      12








      12


      3






      Is their location hardcoded into gcc code or does gcc just call as and we must have as location in our PATH variable?



      And in the latter case, how could we create two completely separate gcc toolchains? I mean, how can we make gcc-A invoke as-A and gcc-B invoke as-B if as-A and as-B are both called as?










      share|improve this question
















      Is their location hardcoded into gcc code or does gcc just call as and we must have as location in our PATH variable?



      And in the latter case, how could we create two completely separate gcc toolchains? I mean, how can we make gcc-A invoke as-A and gcc-B invoke as-B if as-A and as-B are both called as?







      gcc binutils






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited May 15 '15 at 16:17









      Ciro Santilli 新疆改造中心 六四事件 法轮功

      138k33534455




      138k33534455










      asked Oct 9 '11 at 3:12









      Michalis VichosMichalis Vichos

      115110




      115110
























          3 Answers
          3






          active

          oldest

          votes


















          10














          Some of the paths (e.g., to cc1) are compiled in. Others (e.g., as) use normal lookup in $PATH. This can vary depending on the options GCC is configured with.



          You can tell fairly easily by running with strace, and grepping for exec|stat.



          $ strace -f gcc foo.c -o foo |& grep exec

          [pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …


          That is a call to cc1 by a compiled-in path, as you can see from the
          lack of looking for it. Its also not in $PATH.



          [pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
          [pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
          [pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0


          That is looking for as in $PATH. You can tell because its trying each
          location in $PATH in order.



          I've omitted a lot of strace output—even with just stat and exec, its
          several pages long.



          Running gcc -v will show you some of the compiled-in paths (as part of the configure line).






          share|improve this answer
























          • Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

            – Michalis Vichos
            Oct 9 '11 at 23:12






          • 1





            @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

            – derobert
            Oct 10 '11 at 20:22





















          3














          How could we create two completely separate gcc toolchains?



          Compile GCC from source twice, detailed instructions at: Multiple glibc libraries on a single host



          Everything is hardcoded and highly coupled as far as I can see, I don't think there is any other decent solution.



          Query the GCC search path



          You can also query the GCC search path with:



          gcc -print-search-dirs | grep -E '^programs' | tr ':' 'n'


          sample output:



          programs
          =/usr/lib/gcc/x86_64-linux-gnu/6/
          /usr/lib/gcc/x86_64-linux-gnu/6/
          /usr/lib/gcc/x86_64-linux-gnu/
          /usr/lib/gcc/x86_64-linux-gnu/6/
          /usr/lib/gcc/x86_64-linux-gnu/
          /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
          /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
          /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/


          and a specific program with:



          gcc -print-prog-name=cc1


          sample output:



          /usr/lib/gcc/x86_64-linux-gnu/6/cc1





          share|improve this answer

































            2














            There's an ad-hoc option for that: -B*prefix*, quoting gcc docs:




            For each subprogram to be run, the compiler driver first tries the -B prefix, if any. If
            that name is not found, or if -B was not specified, the driver tries two standard prefixes,
            which are /usr/lib/gcc/ and /usr/local/lib/gcc/. [...]







            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f7701206%2fhow-does-gcc-find-as-ld-and-other-binutils-executables%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              10














              Some of the paths (e.g., to cc1) are compiled in. Others (e.g., as) use normal lookup in $PATH. This can vary depending on the options GCC is configured with.



              You can tell fairly easily by running with strace, and grepping for exec|stat.



              $ strace -f gcc foo.c -o foo |& grep exec

              [pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …


              That is a call to cc1 by a compiled-in path, as you can see from the
              lack of looking for it. Its also not in $PATH.



              [pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0


              That is looking for as in $PATH. You can tell because its trying each
              location in $PATH in order.



              I've omitted a lot of strace output—even with just stat and exec, its
              several pages long.



              Running gcc -v will show you some of the compiled-in paths (as part of the configure line).






              share|improve this answer
























              • Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

                – Michalis Vichos
                Oct 9 '11 at 23:12






              • 1





                @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

                – derobert
                Oct 10 '11 at 20:22


















              10














              Some of the paths (e.g., to cc1) are compiled in. Others (e.g., as) use normal lookup in $PATH. This can vary depending on the options GCC is configured with.



              You can tell fairly easily by running with strace, and grepping for exec|stat.



              $ strace -f gcc foo.c -o foo |& grep exec

              [pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …


              That is a call to cc1 by a compiled-in path, as you can see from the
              lack of looking for it. Its also not in $PATH.



              [pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0


              That is looking for as in $PATH. You can tell because its trying each
              location in $PATH in order.



              I've omitted a lot of strace output—even with just stat and exec, its
              several pages long.



              Running gcc -v will show you some of the compiled-in paths (as part of the configure line).






              share|improve this answer
























              • Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

                – Michalis Vichos
                Oct 9 '11 at 23:12






              • 1





                @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

                – derobert
                Oct 10 '11 at 20:22
















              10












              10








              10







              Some of the paths (e.g., to cc1) are compiled in. Others (e.g., as) use normal lookup in $PATH. This can vary depending on the options GCC is configured with.



              You can tell fairly easily by running with strace, and grepping for exec|stat.



              $ strace -f gcc foo.c -o foo |& grep exec

              [pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …


              That is a call to cc1 by a compiled-in path, as you can see from the
              lack of looking for it. Its also not in $PATH.



              [pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0


              That is looking for as in $PATH. You can tell because its trying each
              location in $PATH in order.



              I've omitted a lot of strace output—even with just stat and exec, its
              several pages long.



              Running gcc -v will show you some of the compiled-in paths (as part of the configure line).






              share|improve this answer













              Some of the paths (e.g., to cc1) are compiled in. Others (e.g., as) use normal lookup in $PATH. This can vary depending on the options GCC is configured with.



              You can tell fairly easily by running with strace, and grepping for exec|stat.



              $ strace -f gcc foo.c -o foo |& grep exec

              [pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …


              That is a call to cc1 by a compiled-in path, as you can see from the
              lack of looking for it. Its also not in $PATH.



              [pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
              [pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0


              That is looking for as in $PATH. You can tell because its trying each
              location in $PATH in order.



              I've omitted a lot of strace output—even with just stat and exec, its
              several pages long.



              Running gcc -v will show you some of the compiled-in paths (as part of the configure line).







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Oct 9 '11 at 4:50









              derobertderobert

              39.1k676115




              39.1k676115













              • Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

                – Michalis Vichos
                Oct 9 '11 at 23:12






              • 1





                @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

                – derobert
                Oct 10 '11 at 20:22





















              • Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

                – Michalis Vichos
                Oct 9 '11 at 23:12






              • 1





                @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

                – derobert
                Oct 10 '11 at 20:22



















              Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

              – Michalis Vichos
              Oct 9 '11 at 23:12





              Thank you very much. Do you know which configuration options define the final behavior? Is there any way to limit gcc to use only /my/path/as and my/path/ld?

              – Michalis Vichos
              Oct 9 '11 at 23:12




              1




              1





              @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

              – derobert
              Oct 10 '11 at 20:22







              @MichalisVichos: Probably the configure flag --with-as=/my/path/as would do that. Appears the configure documentation is available at gcc.gnu.org/install/configure.html (or of course with ./configure --help)

              – derobert
              Oct 10 '11 at 20:22















              3














              How could we create two completely separate gcc toolchains?



              Compile GCC from source twice, detailed instructions at: Multiple glibc libraries on a single host



              Everything is hardcoded and highly coupled as far as I can see, I don't think there is any other decent solution.



              Query the GCC search path



              You can also query the GCC search path with:



              gcc -print-search-dirs | grep -E '^programs' | tr ':' 'n'


              sample output:



              programs
              =/usr/lib/gcc/x86_64-linux-gnu/6/
              /usr/lib/gcc/x86_64-linux-gnu/6/
              /usr/lib/gcc/x86_64-linux-gnu/
              /usr/lib/gcc/x86_64-linux-gnu/6/
              /usr/lib/gcc/x86_64-linux-gnu/
              /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
              /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
              /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/


              and a specific program with:



              gcc -print-prog-name=cc1


              sample output:



              /usr/lib/gcc/x86_64-linux-gnu/6/cc1





              share|improve this answer






























                3














                How could we create two completely separate gcc toolchains?



                Compile GCC from source twice, detailed instructions at: Multiple glibc libraries on a single host



                Everything is hardcoded and highly coupled as far as I can see, I don't think there is any other decent solution.



                Query the GCC search path



                You can also query the GCC search path with:



                gcc -print-search-dirs | grep -E '^programs' | tr ':' 'n'


                sample output:



                programs
                =/usr/lib/gcc/x86_64-linux-gnu/6/
                /usr/lib/gcc/x86_64-linux-gnu/6/
                /usr/lib/gcc/x86_64-linux-gnu/
                /usr/lib/gcc/x86_64-linux-gnu/6/
                /usr/lib/gcc/x86_64-linux-gnu/
                /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
                /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
                /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/


                and a specific program with:



                gcc -print-prog-name=cc1


                sample output:



                /usr/lib/gcc/x86_64-linux-gnu/6/cc1





                share|improve this answer




























                  3












                  3








                  3







                  How could we create two completely separate gcc toolchains?



                  Compile GCC from source twice, detailed instructions at: Multiple glibc libraries on a single host



                  Everything is hardcoded and highly coupled as far as I can see, I don't think there is any other decent solution.



                  Query the GCC search path



                  You can also query the GCC search path with:



                  gcc -print-search-dirs | grep -E '^programs' | tr ':' 'n'


                  sample output:



                  programs
                  =/usr/lib/gcc/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/
                  /usr/lib/gcc/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/
                  /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
                  /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/


                  and a specific program with:



                  gcc -print-prog-name=cc1


                  sample output:



                  /usr/lib/gcc/x86_64-linux-gnu/6/cc1





                  share|improve this answer















                  How could we create two completely separate gcc toolchains?



                  Compile GCC from source twice, detailed instructions at: Multiple glibc libraries on a single host



                  Everything is hardcoded and highly coupled as far as I can see, I don't think there is any other decent solution.



                  Query the GCC search path



                  You can also query the GCC search path with:



                  gcc -print-search-dirs | grep -E '^programs' | tr ':' 'n'


                  sample output:



                  programs
                  =/usr/lib/gcc/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/
                  /usr/lib/gcc/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/
                  /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
                  /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
                  /usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/


                  and a specific program with:



                  gcc -print-prog-name=cc1


                  sample output:



                  /usr/lib/gcc/x86_64-linux-gnu/6/cc1






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 20 '18 at 22:05

























                  answered May 16 '15 at 18:20









                  Ciro Santilli 新疆改造中心 六四事件 法轮功Ciro Santilli 新疆改造中心 六四事件 法轮功

                  138k33534455




                  138k33534455























                      2














                      There's an ad-hoc option for that: -B*prefix*, quoting gcc docs:




                      For each subprogram to be run, the compiler driver first tries the -B prefix, if any. If
                      that name is not found, or if -B was not specified, the driver tries two standard prefixes,
                      which are /usr/lib/gcc/ and /usr/local/lib/gcc/. [...]







                      share|improve this answer




























                        2














                        There's an ad-hoc option for that: -B*prefix*, quoting gcc docs:




                        For each subprogram to be run, the compiler driver first tries the -B prefix, if any. If
                        that name is not found, or if -B was not specified, the driver tries two standard prefixes,
                        which are /usr/lib/gcc/ and /usr/local/lib/gcc/. [...]







                        share|improve this answer


























                          2












                          2








                          2







                          There's an ad-hoc option for that: -B*prefix*, quoting gcc docs:




                          For each subprogram to be run, the compiler driver first tries the -B prefix, if any. If
                          that name is not found, or if -B was not specified, the driver tries two standard prefixes,
                          which are /usr/lib/gcc/ and /usr/local/lib/gcc/. [...]







                          share|improve this answer













                          There's an ad-hoc option for that: -B*prefix*, quoting gcc docs:




                          For each subprogram to be run, the compiler driver first tries the -B prefix, if any. If
                          that name is not found, or if -B was not specified, the driver tries two standard prefixes,
                          which are /usr/lib/gcc/ and /usr/local/lib/gcc/. [...]








                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Feb 22 '13 at 21:22









                          yaheyahe

                          33315




                          33315






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f7701206%2fhow-does-gcc-find-as-ld-and-other-binutils-executables%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                              Alcedinidae

                              Origin of the phrase “under your belt”?