
제가 Autotools / Automake / Autoconf를 사용하고 있다는 점을 이해해 주시기 바랍니다.리디렉션을 사용할 수 없습니다.왜냐하면 autotools에 의해 생성된 make 파일에서 명령별로 적용되어야 하기 때문입니다.
autotools가 각 항목과 관련된 컴파일러 및/또는 어셈블러 목록을 생성하고 저장하기 위한 규정이 있는 make 파일을 생성하도록 하는 방법이 필요합니다.개인패키지의 소스입니다.
나의 첫 번째 시도는 CCFLAGS에 '-Wa,-acdhln -g'를 추가하는 것이었습니다. 이것은 실제로 복합 c/어셈블러 목록을 생성했지만터미널로 갔다,파일이 아닌. (리디렉션을 사용하여) make 출력을 캡처하면 산재된 빌드 명령과 함께 47개의 서로 다른 목록이 함께 연결됩니다.
내가 바라던 일이 일어나길 바랐는데, GCC 문서를 낙관적으로 읽었습니다.전체 옵션 - GNU 컴파일러 컬렉션 사용,
-o file
출력을 file file에 넣습니다. 이는 실행 파일, 개체 파일, 어셈블러 파일 또는 전처리된 C 코드 등 생성되는 모든 종류의 출력에 적용됩니다.-o가 지정되지 않은 경우 기본값은 실행 파일을 a.out에, source.suffix에 대한 개체 파일을 source.o에, 어셈블러 파일을 source.s에, 미리 컴파일된 헤더 파일을 source.suffix.gch에 넣는 것입니다. , 표준 출력의 모든 사전 처리된 C 소스.
GCC 명령줄의 "-o {file}.o"에 따라 {file}.o 및 {file}.s 파일이 표시됩니다.
일어난 일은 어셈블리 목록이 분명히 표준 출력으로 전송되었다는 것입니다.
2016년 10월 23일을 추가하기 위해 편집합니다. 이제 문서에서 컴파일러 출력 파일이 어셈블러에 입력으로 전달되고 어셈블러 출력 파일이 링커에 입력으로 전달되는 것과 같은 것에 대해 이야기하고 있다는 것을 깨달았습니다. 캡처하려는 어셈블러 LISTING 파일도 마찬가지입니다.
이는 -save-temps 옵션을 사용하는 경우에도 적용됩니다. 이는 어셈블러 목록 파일이 아닌 링커 입력 파일인 어셈블러의 출력만 저장합니다.
문서에 대한 또 다른 해석은 모든 출력 파일이 -o 피연산자에 이름이 지정된 하나의 단일 파일에 혼합되거나 마지막으로 생성된 파일이 이전에 생성된 파일과 겹쳐 배치된다는 것을 암시할 수 있습니다. (예를 들어, 컴파일러 단계의 출력이 컬렉션 단계의 출력과 중첩된 어셈블러 단계의 출력과 중첩됩니다.)
이는 역효과를 낳는 것처럼 보이므로 GCC(최상위 경영진)가 충분히 똑똑할 수도 있다고 가정했습니다. 다른 패스의 파일 이름을 조정합니다. 이것은 사실이 아닌 것 같습니다."-o"에서 파일 이름을 생략하면 정확히 원하는 대로 보일 수 있지만, 개체 파일 이름은 항상 "{source}.o" 대신 "a.out"으로 지정됩니다. 소스 출력 이름에 대한 상수가 선택된 이유는 이해가 되지 않지만 각 GCC 호출 후 이름 바꾸기 단계에서 "a.out"이 "{source}.o"로 변경될 수 있습니다.
컨설팅GNU 어셈블러 문서-o에 대해서는 훨씬 더 적게 말하고 출력 목록을 처리할 수 있는 옵션이 없습니다. 하나의 어셈블러 버전인 tigcc는 목록이 표준 출력으로 내보내지는 것을 문서화합니다.
Unix에 대한 GNU 및 GNU Build Standard 개정판에서는 이 문제를 해결하지 않았습니까?
(내가 미친 걸까, 아니면 유닉스라는 비현실 속에서 살고 있는 걸까? ??)
이제 Make는 어셈블리 단계가 실행될 때 해당 표준 출력이[이메일 보호됨]파일. GCC 옵션이 어떻게 작동하는지(그리고 사양 파일이 사용되는 방식을 간략하게 살펴보면) 이 작업을 수행할 수 없다고 생각합니다. 아마도 Automake(또는 libtools?)는 어셈블리 출력을 캡처할 수 있도록 다양한 단계를 분리하여 다단계 컴파일 작업을 생성할 수 있습니다.
하지만,make 파일은 autotools에 의해 생성되므로 다음 방법이 필요합니다.autotools에게 make 파일을 생성하라고 지시하세요어셈블리 출력 파일을 생성/캡처합니다. 이 작업을 수행하려면 autoconf/automake 규칙 및/또는 매크로 중 일부를 다시 작성해야 하는 것 같습니다.
마지막으로, 나는 다른 사람이 autotools를 사용하여 만든 패키지를 사용하여 작업하고 있으며, 타르볼로 압축하여 나에게 다운로드했습니다. 나는 autotools 패키징을 하지 않았고 거대한 *.ac 파일을 만들지도 않았으며, 가능하다면 해킹하고 싶지도 않습니다.
패키지 문제를 디버깅하기 위해 어셈블리와 링크 맵이 필요합니다.
답변1
나는 마침내 분해하여 캡처된 터미널 출력을 분석하고 목록 파일을 추출하는 실제 프로그램을 작성했습니다. 내 특정 시스템/빌드 구성/패키지에서는 작동하지만 예제 이상으로 제공할 수는 없습니다. 확실히 쉽게 사용할 수 있는 도구는 아닙니다.
죄송합니다. 이것이 autotools의 단점을 극복하기 위한 일반적인 답변이 아닙니다.